1.shell中变量$相关的含义:
$$ :Shell本身的PID(ProcessID);
$! :Shell最后运行的后台Process的PID;
$? :状态值,最后运行的命令的结束代码(返回值),一般指令程序执行成功值为 0,失败为 1
通过一个简单的脚本,执行后了解各个变量的意义
[root@server1~]# vi variable.sh
#!/bin/sh
echo "number:$#"
echo "shname:$0"
echo "First :$1"
echo "Second:$2"
echo "Parameter List:$@" ##保存退出
[root@server1~]# chmod +x variable.sh ##赋予脚本执行权限
[root@server1~]#./variable.sh a b ##传参 a b 执行脚本 , 输出如下:
number:2
shname:./variable.sh
First: a
Second:b
Parameter List:a b
- $# :
是传给脚本的参数个数,常用于循环
- $0 :
是脚本本身名称
- $1 :
是传递给该shell脚本的第一个参数
- $2 :
是传递给该shell脚本的第二个参数
- $@:
是传给脚本的所有参数列表
- $@ 与 $*
都是列出脚本的所有参数;当它们被双引号" "包含时,符号 $* 将所有的引用变量视为一个整体,以"$1 $2 … $n"的形式组成一个整串;但符号 $@ 则仍旧保留每个引用变量的区段观念,以"$1" "$2" … "$n" 的形式组成一个参数列表。
备注:引用变量的代表方式:$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}...
个位数可直接使用数字,但两位数以上则必须使用 {} 符号来括住。
2.shell 中一些符号的用法:
;
分号 担任 "连续指令"功能的符号。eg:cd ~/backup ; mkdir startup ;cp ~/.* startup/.
其中~ 代表使用者的 home 目录,~+ 符号代表当前的工作目录,~-符号代表上次的工作目录。' '
单引号 被单引号用括住的内容,将被视为单一字串。若引号内有变量$符号则视为一般符号处理,不作变量替换。" "
双引号 被双引号用括住的内容,防止通配符扩展,但允许变量扩展eg hh=home echo \"$hh\" # 输出 home
- `` 反引号 反引号一般用作赋值 ,
$()
和 反引号功能类似
P= `cat ${PARAM_FILE} | grep '{ETL_TIME}=' | awk -F '{ETL_TIME}=' '{print $2}'` ## 运行反引号里面的命令,把结果返回给变量P
P=$(at ${PARAM_FILE} | grep '{ETL_TIME}=' | awk -F '{ETL_TIME}=' '{print $2}') ## 也是运行括号内的内容并把结果返回给变量P
|
管道符号 连接上个指令的标准输出,做为下个指令的标准输入eg:grep *.log | wc -l
!
叹号 通常它代表反逻辑的作用,用 != 来代表"不等于"if [ "$?" != 0 ] then echo "Executes error" exit 1 fi
;规则表达式中担任 “反逻辑” 的角色ls a[!0-9]
表示显示除了a0, a1 … a9 这几个文件的其他文件:
冒号 在 bash 中这是一个内建指令:什么事都不做,但返回状态值 0,
例如: ${HOSTNAME?} ${USER?} ${MAIL?}
检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息?
问号 在文件名扩展上匹配一个任意的字元,但不包含 null 字元, 例如ls 201?05
*
星号 在文件名扩展上用来代表任何字元,包含 null 字元,在运算时则代表乘法$
钱号 变量替换(Variable Substitution)的代表符号vrs=123 echo "vrs = $vrs" ##vrs = 123
,另外在grep、sed、awk、vi中被定义为行的最末端${ }
变量的正规表达式,用来作变量替换
一般情况下$var 与 ${var} 并没有什么不一样,但是用 ${ } 会比较精确的界定变量名称的范围
例如A=B echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来;若使用 ${ }echo ${A}B
就能输出BB了( )
指令群组 用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组(( ))
用在算数运算上,是 bash 的内建功能,例如#!/bin/bash (( a = 10 )) echo -e "inital value, a = $a\\n" (( a++)) echo "after a++, a = $a"
[ ]
中括号 常出现在流程控制中,括住判断式的作用,例如if [ \"$?\" != 0 ] then echo "Executes error" exit1 fi
;例如rm -r 201[1234]
表示删除 2011, 2012, 2013, 2014 目录的意思[[ ]]
与[ ]
符号基本上作用相同,但允许在其中直接使用 || 与&& 逻辑等符号,例如#!/bin/bash read akif [[ $ak > 5 || $ak< 9 ]]then echo $akfi
{ }
大括号 大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定cat ftmp-02 #!/bin/basha=fsh{a=inbc ; echo -e "\\n $a \\n"} echo $a #./ftmp-02 inbcinbc
;另外这种大括号的组合,常用在字串的组合上,例如mkdir {userA,userB,userC}-{home,bin,data}
创建了 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data, userC-home, userC-bin,userC-data这几个目录;例如chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
||
逻辑符号 代表 or 逻辑的符号&&
逻辑符号 代表 and 逻辑的符号&
后台工作 单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作=
等号 常在设定变数时看到的符号var=123 echo "var = $var"
==
等号 常在条件判断式中用到,代表等于的意思if [$vara == $varb]
!=
不等于 常在条件判断式中用到,代表不等于的意思if [$vara != $varb]
^
符号在规则表达式中,代表行的开头;在[]中也与 ! 一样表示非> >> < << :> &> 2&> 2<>>& >&2
输出/输入重导向
cmd > file
把cmd命令的输出重定向到文件file中,如果file已经存在,则清空原有文件
cmd >> file
把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面
cmd < file
cmd命令从file读入
cmd << text
从命令行读取输入,直到一个与text相同的行结束;使用引号把输入括起来,此模式将对输入内容进行shell变量替换;如果使用<<- ,则会忽略接下来输入行首的tab
cmd <> file
以读写模式把文件file重定向到输入,文件file不会被破坏
cmd >| file
功能同>,但即便在设置了noclobber时也会复盖file文件
: > filename
把文件filename截断为0长度,如果文件不存在,就创建一个0长度的文件(与touch的效果相同)
cmd >&n
把输出送到文件描述符n
cmd m>&n
把输出 到文件符m的信息重定向到文件描述符n
cmd >&-
关闭标准输出
cmd <&n
输入来自文件描述符n
cmd m<&n
m来自文件描述各个n
cmd <&-
关闭标准输入
cmd <&n-
移动输入文件描述符n而非复制它
cmd >&n-
移动输出文件描述符 n而非复制它
>&
实际上复制了文件描述符,这使得cmd > file 2>&1与cmd 2>&1 >file的效果不一样