• 可以在shell脚本中使用管道或者重定向循环输出结果。
  • shell执行程序的位置参数通过标准数字表示时,其中$0为程序名称,$1为第一个参数。类推。如果参数大于9个,必须用大括号括起来。
  • 位置参数都是通过空格分隔的,要想参数中包含空格,必须使用单引号或者双引号。

  • 编写带有参数的脚本的时候应当检查参数的存在。

  • 参数计数:$#,计算存储执行脚本中包含的命令行参数个数;${!#}可获取到最后一个参数;当命令行中没有任何参数时,$#赋给的值为0,但变量${!#}将返回明林能够行中使用的脚本名称。

  • 获取所有变量中的命令行参数:$*和$@:变量$×所有参数视为一个单词,而变量$@分别对待每个参数。

  • shift命令能够改变命令行参数的相对位置,默认参数变量左移一个位置。也可以通过shift命令提供一个参数来实行多位移变化:shift+n

  • 参数的引用时,最好用双引号括上参数($1,$×等)

  • 执行shell脚本时经常会遇到既需要使用选项又需要使用参数的情况,使用双破折号(- -)指示选项列表的结束。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
	#!/bin/bash
#extracting options and parameters
while [ -n "$1" ]
do
	case "$1" in
	-a) echo "Found the -a option" ;;
	-b) echo "Found the -b option" ;;
	-c) echo "Found the -c option" ;;
	--) shift
	break;;
	*) echo "$1 is not an option";;
	esac
	shift
done
count=1
for param in $@
do
	echo "Parameter #$count:$param"
	count=$[ $count+1 ]
done
  • 有些选项需要附加的参数值,这种情况下,命令行格式与下面格式类似:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    #!/bin/bash
#extracting command line options and values
while [ -n "$1" ]
do
	case "$1" in
	-a) echo "Found the -a options";;
	-b) param="$2"
	echo "Found the -b option,with parameter value $param"
	shift ;;
	-c) echo "Found the -c option";;
	--) shift #使用双破折号(--)指示选项列表的结束。
	break;;
	*) echo "$1 is not an option";;
	esac
	shift
done
  • getopt命令处理命令行选项和参数时非常方便。对参数重新组织

    1. 命令格式:getopt options optstring parameters选项字符串(optstring)定义了命令行中有效字母,需要参数值选项后放一个冒号。,getopt根据定义的optstring解析参数。-q可以忽略getopt错误消息。
    2. 脚本中使用getopt:set命令的一个选项是双破折号,表示将命令行参数转换为set命令的命令行中的值。set -- 'getopt -q ab:cd "$@"'(反引号)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
#extracting command line options and values with getopt
set -- `getopt -q ab:c "$@"`
while [ -n "$1" ]
do
	case "$1" in
	-a) echo "Found the -a options";;
	-b) param="$2"
	echo "Found the -b option,with parameter value $param"
	shift ;;
	-c) echo "Found the -c option";;
	--) shift
	break;;
	*) echo "$1 is not an option";;
	esac
	shift
done
count=1
for param in "$@"
do
	echo "Parameter #$count: $param"
	count=$[ $count+1 ]
done
  • getopt命令不能很好地处理带有空格的参数值,它将空格解析为参数分隔符。
  • 更高级的getopts命令:getopts命令顺序地对现有shell参数进行处理(循环中解析所有命令行参数):getopts optstring variable在选项字符串中列出有效选项字母,如果选项字母需要参数值后面加上一个冒号。如果要禁止输出错误消息,那么使选项字符串以冒号开头。
  • getopts使用两个环境变量。环境变量OPTARG中包含需要参数值的选项要使用的值;OPTIND包含的值表示getopts停止处理时在参数列表中的位置。(getopts的case定义中不用破折号,选项字母和参数值中间可以没有空格,getopts将在命令行中找到的未定义的选项都绑定为单一的输出–问号)
  • getopts命令知道何时停止处理选项,留下参数。getopts每次处理选项,环境变量OPTIND的值会增加1。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    #!/bin/bash
while getopts 🆎cd test
do
	case $test in
	a) echo "Found the -a option";;
	b) echo "Found the -b option,with value $OPTARG";;
	c) echo "Found the -c option";;
	d) echo "Found the -d option";;
	*) echo "Unknown option:$test";;
	esac
done
shift $[ $OPTIND-1 ]
count=1
for param in $@
do
	echo "Parameter $count: $param"
	count=$[ $count+1 ]
done
  • 常用的Linux命令行选项

    选项描述选项描述
    -a显示所有对象-n使用非交互式(批量)模式
    -c生成计算-o指定一个输出文件来重定向输出
    -d指定目录-q以quiet模式执行
    -e展开对象-r递归处理目录和文件
    -f指定读取数据的文件-s以silent模式执行
    -h显示命令的帮助信息-v生成verbose输出
    -i忽略大小写-x排除和拒绝
    -l生成长格式的输出-y设置所有提问的回答为yes
  • 获取用户输入:

    • 基本读取:read命令,read命令行中如果不指定变量,那read命令将接收到的数据防止在环境变量REPLY中。
    • 计时:read的-t参数可以计时
    • 默读:read的-s参数
  • 标准文件描述符:0:STDIN(标准输入);1:STDOUT(标准输出);2:STDERR(标准错误)

  • 重定向错误

    1. 仅重定向错误:ls -al badfile 2>test4
    2. 重定向错误和数据:ls -al test test2 test3 badfile 2>test6 1>test7
    3. 使用&>符号,可以将STDEER和STDOUT输出重定向到同一个输出文件。(bash sshell自动使错误消息的优先级高于标准输出)
  • 在脚本中重定向输出:

    1. 临时重定向:重定向到某个文件描述符时,必须在文件描述符前添加&号e.g:echo "This is an error message" >&2
    2. 永久重定向:使用exec命令通知shell在脚本执行期间重定向特定的文件描述符:
1
2
3
4
5
6
7
8
#!/bin/bash
#redirecting all output to a file
exec 2>testerror
echo "This is a test of redirecting all output"
echo "from  a script to another file."
exec 1>testout
echo "without having to redirect every individual line"
echo "but this should go to the testerror file" >&2
  • 在脚本中重定向输入:exec 0< testfile
  • 使用exec命令还可以创建自己的重定向,在shell中最多可以有9个打开的文件描述符exec 3>test
  • 重定向文件描述符和创建输入文件描述符
  • 创建读取/写入文件描述符:exec 3<>testfile
  • 关闭文件描述符&-:exec 3>&-
  • lsof命令列出整个Linux系统上所有开放文件描述符。(它向非系统管理员提供了Linux系统的信息。许多Linux系统都隐藏了该命令,以防用户无意中使用了它
  • 不希望显示任何脚本输出时可以将STDERR重定向到空文件(null file)的特殊文件。shell输出到空文件的任何数据都不会保存。该文件的位置是dev/null,任何重定向到该位置的数据都将丢失且不会显示。
  • Linux使用/tmp目录处理不需要永久保存的文件,很多Linux系统配置在启动时自动删除/tmp中的文件。
  • mktemp命令可以在/tmp创建临时文件,仅文件所有者有读写权限。
  • mktemp默认在本地目录创建文件。只需指定一个文件名模板和6个X:mktemp testing.XXXXXX
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    #实例
#!/bin/bash
#creating and using a temp file
tempfile=`mktemp test.XXXXXX`
exec 3>$tempfile
echo "This script writes to temp file $tempfile"
echo "This is the first line">&3
echo "This is the second line">&3
echo "This is the third line">&3
exec 3>&-
echo "Done creating temp file .The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null
  • -t选项强迫mktemp在系统的临时文件夹中创建文件;-d选项让mktemp命令创建一个临时目录。