Linux中变量$# $@ $0 $1 $2 $* $$ $?的含义

Posted on Posted in bash
Tips: 本文创建于2013年11月13日,已超过 2 年,内容或图片可能已经失效!
  • $# 是传给脚本的参数个数
  • $0 是脚本本身的名字
  • $1 是传递给该shell脚本的第一个参数
  • $2 是传递给该shell脚本的第二个参数
  • $@ 是传给脚本的所有参数的列表
  • $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
  • $$ 是脚本运行的当前进程ID号
  • $! Shell最后运行的后台Process的PID
  • $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

示例

echo $1
echo $2
echo $#
echo $0
echo $@
echo $*
echo $!
echo $$
echo $?

运行结果

a
b
2
./test
a b
a b
14214
0

文件或目录判断

  • -b file 若文件存在且是一个块特殊文件,则为真
  • -c file 若文件存在且是一个字符特殊文件,则为真
  • -d file 若文件存在且是一个目录,则为真
  • -e file 若文件存在,则为真
  • -f file 若文件存在且是一个规则文件,则为真
  • -g file 若文件存在且设置了SGID位的值,则为真
  • -h file 若文件是软链接,则为真
  • -k file 若文件存在且设置了”sticky”位的值
  • -L file 若文件为符号链接,则为真
  • -p file 若文件存在且为一已命名管道,则为真
  • -r file 若文件可读,则为真
  • -s file 判断文件是否存在,且是否为非空,不为空,则为真
  • -S file 判断文件是否存在,且是否为套接字文件
  • -t file 文件描述符(默认为1)指定的设备为终端时为真
  • -u file 若文件存在且设置了SUID位,则为真
  • -w file 若文件可写,则为真
  • -x file 若文件可执行,则为真
  • [ file1 -nt file2 ] 若file1比file2新,或file1存在但file2不存在,则为真
  • [ file1 -ot file2 ] 若file1比file2老,或file2存在但file1不存在,则为真
  • [ file1 -ef file2 ] 若file1和file2指向相同的设备和节点号则返回,为真

整数判断

  • -eq 两数相等,则为真 例:if [ "$a" -eq "$b" ]
  • -ne 两数不相等,则为真 例:if [ "$a" -ne "$b" ]
  • -gt a大于b,则为真 例:if [ "$a" -gt "$b" ]
  • -ge 大于或等于,则为真 例:if [ "$a" -ge "$b" ]
  • -lt a小于b,则为真 例:if [ "$a" -lt "$b" ]
  • -le a小于或等于b,则为真 例:if [ "$a" -le "$b" ]
  • < 小于(需双括号) 例:(("$a" < "$b"))
  • <= 小于等于(需双括号) 例:(("$a" <= "$b"))
  • 大于(需双括号) 例:(("$a" > "$b"))

  • = 大于等于(需双括号) 例:(("$a" >= "$b"))

  • 小数据比较可使用AWK。

逻辑运算判断符

  • ! [ ! false ] 返回true 逻辑否,条件为假,结果为真

  • -a [ $a -lt 2 -a $b -gt 5 ] 返回true 逻辑与,两个表达式都为真,则为真

  • -o [ $a -lt 2 -o $b -gt 5 ] 返回true 逻辑或,只要有一个表达式为true,则为真

  • [ ] || [ ] 用OR来合并两个条件

  • [ ] && [ ] 用AND来合并两个条件

字符串判断

  • == 若两个字符串相同则为真,与=等价 例:[ "str1" = "str2" ]
  • != 若字符串不相同则为真 例:[ "str1" != "str2" ]
  • < 若str1字典排序在str2前则为真 例:[[ "str1" < "str2" ]] > 若str1字典排序在str2后则为真 例:[ "str1" > "str2" ]
  • -n 若str长度非零则为真,即非空 例:[ -n "str1" ]
  • -z 若file长度为零,即空,则为真 例:[ -z "str1" ]