1.来自命令行的参数
./test 10 20 40 这些变量被成为位置参数. $0为程序名, $1为第一个参数, $2为第二个参数.....
2.特殊的参数变量
参数计数: $# 表示来自命令行的参数个数
所有参数: $* 和 $@在一个变量中包含所有命令行参数. $*把所有参数当场一个单词处理. $@将所有参数作为同一个字符串中的多个单词处理.
位移: shift 将每个参数变量左移一个位置. ( $0不变, 丢弃原$1变量 )
3.处理选项
看一个例子
#!/bin/bash
# extracting command line options
while [ -n "$1" ]
do
case "$1" in
-a) echo "-a option is in command line" ;;
-b) echo "-b option is in command line" ;;
-c) echo "-c option is in command line" ;;
*) echo "$1 is not a option" ;;
esac
shift
done
输入输出:
allen@ubuntu:~/homework$ ./shell.sh -a -b -c -d
-a option is in command line
-b option is in command line
-c option is in command line
-d is not a option从参数中分离选项:
有时会遇到即需要参数又需要选项的情况, 通过一个特殊字符码将二者分离: 双破折号 --
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-a) echo "-a option is in command line" ;;
-b) echo "-b option is in command line" ;;
-c) echo "-c option is in command line" ;;
--) shift
break ;;
*) echo "$1 is not a option" ;;
esac
shift
done
count=1
for param in $@
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
输入输出:
allen@ubuntu:~/homework$ ./shell.sh -a -b -c -- v1 v2 v3
-a option is in command line
-b option is in command line
-c option is in command line
Parameter #1: v1
Parameter #2: v2
Parameter #3: v3
处理带值的选项:
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-a) echo "-a option is in command line" ;;
-b) param="$2"
echo "-b option with parameter value $param"
shift 2;;
-c) echo "-c option is in command line" ;;
--) shift
break ;;
*) echo "$1 is not a option" ;;
esac
shift
done
count=1
for param in $@
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
输入输出:
allen@ubuntu:~/homework$ ./shell.sh -a -b v1 -c -- v2 v3
-a option is in command line
-b option with parameter value v1
Parameter #1: v2
Parameter #2: v3
使用getopt命令:
getopt options optstring parameters
选项字符串(optstring)是处理的关键,它定义命令行中的有效选项字母,还定义哪些选项字母需要参数值.
首先,在选项字符串(optstring)中列出将在脚本中用到的每个命令行选项字母.然后,在每个需要参数值的选项字母后面放置一个冒号.
allen@ubuntu:~$ getopt ab:cd -a -b v3 -cd v1 v2
-a -b v3 -c -d -- v1 v2在脚本中使用getopt:
通过set命令处理shell中的各种变量 ---- 将原始脚本命令行参数送给getopt,然后将getopt命令的输出送给set命令
set -- `getopt -q ab:cd "$@"`
4.获取用户输入
read命令接受标准输入,或其他文件描述符输入
#!/bin/bash
echo -n "Enter your name:"
read name
echo "Hello $name, welcome!"
allen@ubuntu:~/learnlinux$ ./read.sh
Enter your name:allen
Hello allen, welcome!
read输入多个变量:
read -p "Enter your name: " first last
通过read读取文件:
每用一次read命令都会读取文件中的一行文本,当文件中没有可读的行时,read命令将以非零退出状态退出
#!/bin/bash
count=1
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished read the file"