shell脚本的常用总结

来源:互联网 发布:bender建模软件 编辑:程序博客网 时间:2024/06/06 03:15

一. shell脚本调用另一个脚本的三种形式(网上摘录)

  • fork
    形式: ./2.sh(默认)
    运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。
    sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

  • exec (exec /directory/script.sh)
    形式:exec ./2.sh
    exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。
    但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

  • source (source /directory/script.sh)
    形式: . ./2.sh
    与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
    ./a.sh ./b.sh

二. $()和${}区别
$( ) 与 ` ` (反引号) 都是用来做命令替换用
例如:command1 command2command3 (cmd3提换出来给cmd2->cmd1) 错误表达式
若需上述修改:command1`command2\command3` 正确
也可以使用$()就减小 \
` 的错误
command1$(command2 $(command3))

${}用来做变量替换A=B${A}B  $AB   前者为BB 后者为空

三. tr命令
可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
tr ’ ’ ‘\n’ 将空格提换成\n
-s: echo “1122333345” | tr -s ‘13’
-c:取代
-d:删除
四. sed表达式
sed ‘/^$/d’  删除空行. 正则表达式中^表示行首,$表示行尾,^$表示空行.d表示删除

五. awk
awk ‘{print “\t”,NR”.”,$0}’

NR是awk内置变量,Number of Records的缩写,表示当前记录条数(文件行数);$0表示当前行的所有内容。

六. cat<< EOF


打印信息


EOF

七. $# 表示传入脚本参数的个数

八. shift
位置参数可以用shift命令左移。比如shift 3表示原来的41,原来的52等等,原来的12、30不移动。不带参数的shift命令相当于shift 1。
八、#/和%/的区别
M=$(pwd -P) // /a/b/c/d
M=”${M%/*}” // /a/b/c
N=”${M#*/}” // a/b/c/d
也就是说%/*代表取从头到最后一个slash之前的所有内容
#/*代表去取从第一个slash之后的所有内容

九、##_和%%_的区别
AD=dsfssd_config
echo ${AD##*_}
config

echo ${AD%%_*}
dsfssd

十. 正确、错误、警告的打印方式
echo -e “\033[47;31mERROR: $*\033[0m”
echo -e “\033[47;34mWARN: $*\033[0m”
echo -e “\033[47;30mINFO: $*\033[0m”

十一. 通过#*/做字符串的剪切
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法:
是 去掉左边(键盘上#在 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

0 0
原创粉丝点击