命令行参数
$0
是程序名, $1
第一个参数, 直到$9
是第九个参数
./a.sh aaa bbb ccc
命令行参数用空格隔开
./a.sh 1 2 3 "ha ha" 'world hello'
命令行参数可以是数值,也可以是字符串,字符串中有空格需用单双引号表明
./a.sh 1 2 3 4 5 6 7 8 9 10 11
若变量不止九个时,引用时需加{},${10}...
./a.sh
用$0
获取脚本名时是 ./a.sh
name=$(basename $0) basename
可以返回不包含路径的脚本名
*
脚本认为参数变量应该有而实际没有时会报错,注意检查传入参数是否有数据
一个简单例子:
if [ -n $1 ]; then
echo no argv
fi
name=$(basename $0)
if [ $name = "addem" ]; then
echo addem
elif [ $name = "multem" ]; then
echo multem
fi
#cp a.sh addem
#chmod u+x addem
#ln -s a.sh multem
#./addem 1 2 -> addem
#./multem 1 2 -> multem
特殊参数变量
$#
脚本运行时命令行参数个数
${!#}
最后一个命令行参数,不是(\${$#}
)
*
当没有命令行参数时,$#
的值为0,${!#}
值为执行脚本名
$*
将所有参数变量当做一个单词保存,而不是多个个体
$@
将所有参数当做一个字符串中多个独立的单词,遍历命令行参数的一个重要变量
for i in $@ # for i in "$@"
do
echo $i
done
移动变量
shift
默认将每个参数向左移动一个位置
shift 2
一次移动两个位置, n 指定一次移动的个数
*
shift 命令移出的参数,它的值就被丢弃了,无法再恢复
while [ -n $1 ]; do
echo $1
shift # shift 2
done
处理选项
*
选项-
单破折线后的单个字母
*
用双破折线--
表示选项结束
*
用shift
命令将双破折线移出参数变量
一个栗子:
while [ -n $1 ] #判断命令行参数是否为空
do
case $1 in
-a) echo "find -a option" ;;
-b) param=$2
echo "find -b option, paramter is $param"
shift;;
-c) echo "find -c option";;
--) shift
break;;
*) echo "$1 is not a option";;
esac
shift
done
for param in $@ #遍历命令行参数
do
echo $param
done
getopt
可以解决合并选项
的问题
getopt
能够识别命令行参数,脚本中处理更方便
在需要参数值的选项后面加上冒号(:
)
-q
忽略错误消息
set -- $(getopt -q ab:c $@)
双破折线–将命令行参数替换成set命令的命令行值
一个栗子:
set -- $(getopt -q ab:c $@)
while ... # 下面代码同上个栗子
...
#./a.sh -a -b test1 -cdefg test2 test3
getopts
可以解决带空格和引号
的参数值
getopts
一次只处理命令行上检测到的一个参数,处理完所有参数后,返回一个大于0的退出状态码
如果选项字母有参数值加一个冒号(:
)如果想要去掉错误消息,则在选项前
加冒号
OPTARG
如果选项需要跟一个参数值,该变量会保存该值
OPTIND
保存了参数列表中getopts正在处理的参数位置
一个栗子:
while getopts :ab:cd opt #第一个引号表示忽略错误
do
case $opt in
a) echo "find -a";; # getopts命令解析命令行选项时会移除开头的破折线
b) echo "find -b, with value $OPTARG";; # b选项带参数时,值保存在OPTARG中
c) echo "find -c";;
d) echo "find -d";;
*) echo "unknown option: $opt"
esac
done
shift $[ $OPTIND - 1 ]
for param in $@
do
echo $param
done
# ./a.sh -a -b "test1 2" -d test2 test3 test4
常用的Linux命令选项
选项 | 描述 |
---|---|
-a | 显示所有对象 |
-d | 指定一个目录 |
-e | 扩展一个对象 |
-f | 指定读入的数据文件 |
-h | 显示命令的帮助信息 |
-i | 忽略文本大小写 |
-l | 产生输出的长格式文本 |
-n | 使用非交互模式 |
-o | 将所有输出重定向到指定的文件 |
-q | 以安静的模式运行 |
-r | 递归处理文件或者目录 |
-s | 以安静的模式运行 |
-v | 生成详细输出 |
-x | 排除摸个对象 |
-y | 对所有问题回答yes |
-c | 生成一个计数 |
获取用户的输入
read
从标准输入或者文件描述符中接受输入,read将数据放入一个变量中
read name
将数据放入name变量中
echo -n "please input your name: " # -n 选项不会在字符串末尾输出换行符
read name
read -p "please input : " name
-p选项允许在命令行指定提示符
*read
命令会将提示符后输入的所有数据依次分配给后面的变量,若变量不够则剩下的分配给最后一个变量
*
在命令行中不指定变量,read
会将收到的所有数据存入特殊环境变量REPLY
中
read -t 5 -p "please input: " name
设置超时,-t
指定一个定时器,指定了等待输入的秒,计数器过期后,read返回一个非零状态退出码
read -n1 -p "please input [Y/y]:" name
将-n
和数值1
一起使用,告诉read命令接受单个字符后退出
read -s -p "please input passwd: " passwd
可以避免read输入的数据显示在显示器上(实际是read命令将文本颜色设置成背景色)
逐行读取文件中的内容
cat a.file | while read line
do
echo $line
done
# 另外一种形式
while read line
do
echo $line
done < a.file