Unix/Linux shell脚本编程学习--Shell Script II
Shell Script II
10.Shell echo命令
- echo "OK!\n” #显示换行
- echo "It is a test"
echo无拼接字符时后一般可以不使用”引号”,从上面可看出,双引号可有可无,单引号主要用在原样输出中。
显示结果重定向保存至文件:
- vim myfile 创建文件
- echo "It is a test" > myfile
- cat myfile 查看文件内容
若需要原样输出字符串(不进行转义),请使用单引号。例如:
复制纯文本新窗口
- echo '$name\"'
11.shell printf命令:格式化输出语句
printf 命令用于格式化输出, 是echo命令的增强版。printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。
- $printf "Hello, Shell\n"
- # format-string为双引号
- $ printf "%d %s\n" 1 "abc"
- 1 abc
- # 单引号与双引号效果一样
- $ printf '%d %s\n' 1 "abc"
- 1 abc
- # 没有引号也可以输出
- $ printf %s abcdef
- abcdef
- # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
- $ printf %s abc def
- abcdef
- $ printf "%s\n" abc def
- abc
- def
- $ printf "%s %s %s\n" a b c d e f g h i j
- a b c
- d e f
- g h i
- j
- # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
- $ printf "%s and %d \n"
- and 0
- # 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
- $ printf "The first program always prints'%s,%d\n'" Hello Shell
- -bash: printf: Shell: invalid number
- The first program always prints 'Hello,0'
- $
12.Shell if else语句:
Shell 有三种 if ... else 语句:
- if ... fi 语句;
- if ... else ... fi 语句;
- if ... elif ... else ... fi 语句。
if ... else ... fi 语句
- if [ $a == $b ]
- then
- echo "a is equal to b"
- else
- echo "a is not equal to b"
- fi
if ... elif ... fi 语句
- if [ $a == $b ]
- then
- echo "a is equal to b"
- elif [ $a -gt $b ]
- then
- echo "a is greater than b"
- elif [ $a -lt $b ]
- then
- echo "a is less than b"
- else
- echo "None of the condition met"
- fi
if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
复制纯文本新窗口
- if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
if ... else 语句也经常与 test 命令结合使用,如下所示:
复制纯文本新窗口
- num1=$[2*3]
- num2=$[1+5]
- if test $[num1] -eq $[num2]
- then
- echo 'The two numbers are equal!'
- else
- echo 'The two numbers are not equal!'
- fi
13.Shell case esac语句
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
- read aNum
- case $aNum in
- 1) echo 'You select 1'
- ;;
- 2) echo 'You select 2'
- ;;
- 3) echo 'You select 3'
- ;;
- 4) echo 'You select 4'
- ;;
- *) echo 'You do not select a number between 1 to 4'
- ;;
- esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
- option="${1}"
- case ${option} in
- -f) FILE="${2}"
- echo "File name is $FILE"
- ;;
- -d) DIR="${2}"
- echo "Dir name is $DIR"
- ;;
- *)
- echo "`basename ${0}`:usage: [-f file] | [-d directory]"
- exit 1 # Command to come out of the program with status 1
- ;;
- esac
14.Shell for循环
- for循环一般格式为:for 变量 in 列表
- do
- command1
- ...
- commandN
- done
例如,顺序输出当前列表中的数字:顺序输出字符串中的字符:
- for loop in 1 2 3 4 5 string qwerty
- do
- echo "The value is: $loop"
- done
显示主目录下以 .bash 开头的文件:
- #!/bin/bash
- for FILE in $HOME/.bash*
- do
- echo $FILE
- done
14.Shell while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while command
do
Statement(s) to be executed if command is true
done
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。
以下测试条件是:如果COUNTER小于5,那么返回 true。
- COUNTER=0
- while [ $COUNTER -lt 5 ]
- do
- COUNTER='expr $COUNTER+1'
- echo $COUNTER
- done
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
- echo 'type <CTRL-D> to terminate'
- echo -n 'enter your most liked film: '
- while read FILM
- do
- echo "Yeah! great film the $FILM"
- done
15.Shell until循环
与 while 循环在处理方式上刚好相反, until 循环执行一系列命令直至条件为 true 时停止,循环格式为:
until command
do
Statement(s) to be executed until command is true
done
- a=0
- until [ ! $a -lt 10 ]
- do
- echo $a
- a=`expr $a + 1`
- done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
16.Shell break和continue命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
- while :
- do
- echo -n "Input a number between 1 to 5: "
- read aNum
- case $aNum in
- 1|2|3|4|5) echo "Your number is $aNum!"
- ;;
- *) echo "You do not select a number between 1 to 5, game is over!"
- break
- ;;
- esac
- done
在嵌套循环中,break n命令后面还可以跟一个整数,表示跳出第几层循环:
- for var1 in 1 2 3
- do
- for var2 in 0 5
- do
- if [ $var1 -eq 2 -a $var2 -eq 0 ]
- then
- break 2
- else
- echo "$var1 $var2"
- fi
- done
- done
如上,break 2 表示直接跳出外层循环。
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
- while :
- do
- echo -n "Input a number between 1 to 5: "
- read aNum
- case $aNum in
- 1|2|3|4|5) echo "Your number is $aNum!"
- ;;
- *) echo "You do not select a number between 1 to 5!"
- continue
- echo "Game is over!"
- ;;
- esac
- done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句
- echo "Game is over!"
永远不会被执行。
同样,continue 后面也可以跟一个数字,表示跳出第几层循环。
- NUMS="1 2 3 4 5 6 7"
- for NUM in $NUMS
- do
- Q=`expr $NUM % 2`
- if [ $Q -eq 0 ]
- then
- echo "Number is an even number!!"
- continue
- fi
- echo "Found odd number"
- done
17.Shell函数:Shell函数返回值、删除函数、在终端调用函数
Shell 函数的定义格式如下(关键字 function可以不加):
function function_name () {
list of commands
[ return value ]
}
调用函数只需要给出函数名,不需要加括号。
函数返回值在调用该函数后通过 $? 来获得。
#!/bin/bash
# Define your function here
funcWithReturn(){
echo -n "input a number now!:" #加 -n 取消输出换行
read numb;
rn=`expr $numb + 2`
return $rn
}
funcWithReturn #调用函数 无需带()
ret=$? #使用¥?读取上面的函数返回值
echo "result of funcWithReturn is: $ret"
#函数嵌套:
nestedFunc(){
funcWithReturn #函数内部调用其他函数 函数嵌套
printf %s\\n $?
}
nestedFunc
像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项
- $unset .f function_name
如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。
18.Shell函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...funWithParam(){
echo "参数个数 $# !" # 参数个数
echo "传递给函数的所有参数:$*" # 传递给函数的所有参数
echo "第一个参数 $1 !"
echo "第二个参数 $2 !"
echo "第十个参数 ${10} !" #第十个以上的参数就需要带{}访问了
echo "第十一个参数 ${11} !"
}
#调用函数时,后面跟上参数的列表
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
特殊变量列表
变量
含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数( 命令行参数 )。n 是一个数字,表示第几个参数。
例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数。
$@
传递给脚本或函数的所有参数。
被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数.
退出状态 : $?可以获取上一个命令的退出状态。大部分命令执行成功会返回 0,失败返回 1。($? 也可以表示函数的返回值)
18.Shell输入输出重定向:Shell Here Document,/dev/null文件
Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
输出重定向:命令的输出不仅可以是显示器,还可以很容易的转移向到文件。语法: $ command> file
- $ who > users #将who命令的输出信息定向到文件users里
输出重定向会覆盖文件内容!
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾:
$ echo line 2 >> users
$ cat users
输入重定向和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:$command< file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
$ wc -l users #计算 users 文件中的行数
也可以将输入重定向到 users 文件: $ wc -l < users
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:
- $command 2 > file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
- $command 2 >> file
2 表示标准错误文件(stderr)。
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
- $command > file 2>&1 cal > f 2>&1
或
- $command >> file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写:
- $command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
全部可用的重定向命令列表
命令
说明
command > file
将输出重定向到 file。
command < file
将输入重定向到 file。
command >> file
将输出以追加的方式重定向到 file。
n > file
将文件描述符为 n 的文件重定向到 file。
n >> file
将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m
将输出文件 m 和 n 合并。
n <& m
将输入文件 m 和 n 合并。
<< tag
将开始标记 tag 和结束标记 tag 之间的内容作为输入。
19.Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
- command << delimiter
- document
- delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
- 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
- 开始的delimiter前后的空格会被忽略掉。
下面的例子,通过 wc -l 命令计算 document 的行数:
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
也可以 将 Here Document 用在脚本中,例如:
- #!/bin/bash
- cat << EOF
- This is a simple lookup program
- for good (and bad) restaurants
- in Cape Town.
- EOF
运行结果:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
下面的脚本通过 vi 编辑器将 document 保存到 test.txt 文件:
- #!/bin/sh
- filename=test.txt
- vi $filename <<EndOfCommands
- i
- This file was created automatically from
- a shell script
- ^[
- ZZ
- EndOfCommands
运行脚本:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
打开 test.txt,可以看到下面的内容:
$ cat test.txt
This file was created automatically from
a shell script
$
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
- $ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
- $ command > /dev/null 2>&1
20.Shell文件包含
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
Shell 中包含脚本可以使用:
- . filename
或
- source filename
两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
例如,创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:
- url="http://see.xidian.edu.cn/cpp/view/2738.html"
一个是主文件 main.sh,内容如下:
- #!/bin/bash
- . ./subscript.sh
- echo $url
执行脚本:
$chomd +x main.sh
./main.sh
http://see.xidian.edu.cn/cpp/view/2738.html
$
注意:被包含脚本不需要有执行权限。
Shell Script II
10.Shell echo命令
- echo "OK!\n” #显示换行
- echo "It is a test"
echo无拼接字符时后一般可以不使用”引号”,从上面可看出,双引号可有可无,单引号主要用在原样输出中。
显示结果重定向保存至文件:
- vim myfile 创建文件
- echo "It is a test" > myfile
- cat myfile 查看文件内容
若需要原样输出字符串(不进行转义),请使用单引号。例如:
复制纯文本新窗口
- echo '$name\"'
11.shell printf命令:格式化输出语句
printf 命令用于格式化输出, 是echo命令的增强版。printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。
- $printf "Hello, Shell\n"
- # format-string为双引号
- $ printf "%d %s\n" 1 "abc"
- 1 abc
- # 单引号与双引号效果一样
- $ printf '%d %s\n' 1 "abc"
- 1 abc
- # 没有引号也可以输出
- $ printf %s abcdef
- abcdef
- # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
- $ printf %s abc def
- abcdef
- $ printf "%s\n" abc def
- abc
- def
- $ printf "%s %s %s\n" a b c d e f g h i j
- a b c
- d e f
- g h i
- j
- # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
- $ printf "%s and %d \n"
- and 0
- # 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
- $ printf "The first program always prints'%s,%d\n'" Hello Shell
- -bash: printf: Shell: invalid number
- The first program always prints 'Hello,0'
- $
12.Shell if else语句:
Shell 有三种 if ... else 语句:
- if ... fi 语句;
- if ... else ... fi 语句;
- if ... elif ... else ... fi 语句。
if ... else ... fi 语句
- if [ $a == $b ]
- then
- echo "a is equal to b"
- else
- echo "a is not equal to b"
- fi
if ... elif ... fi 语句
- if [ $a == $b ]
- then
- echo "a is equal to b"
- elif [ $a -gt $b ]
- then
- echo "a is greater than b"
- elif [ $a -lt $b ]
- then
- echo "a is less than b"
- else
- echo "None of the condition met"
- fi
if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
复制纯文本新窗口
- if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
if ... else 语句也经常与 test 命令结合使用,如下所示:
复制纯文本新窗口
- num1=$[2*3]
- num2=$[1+5]
- if test $[num1] -eq $[num2]
- then
- echo 'The two numbers are equal!'
- else
- echo 'The two numbers are not equal!'
- fi
13.Shell case esac语句
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
- read aNum
- case $aNum in
- 1) echo 'You select 1'
- ;;
- 2) echo 'You select 2'
- ;;
- 3) echo 'You select 3'
- ;;
- 4) echo 'You select 4'
- ;;
- *) echo 'You do not select a number between 1 to 4'
- ;;
- esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
- option="${1}"
- case ${option} in
- -f) FILE="${2}"
- echo "File name is $FILE"
- ;;
- -d) DIR="${2}"
- echo "Dir name is $DIR"
- ;;
- *)
- echo "`basename ${0}`:usage: [-f file] | [-d directory]"
- exit 1 # Command to come out of the program with status 1
- ;;
- esac
14.Shell for循环
- for循环一般格式为:for 变量 in 列表
- do
- command1
- ...
- commandN
- done
例如,顺序输出当前列表中的数字:顺序输出字符串中的字符:
- for loop in 1 2 3 4 5 string qwerty
- do
- echo "The value is: $loop"
- done
显示主目录下以 .bash 开头的文件:
- #!/bin/bash
- for FILE in $HOME/.bash*
- do
- echo $FILE
- done
14.Shell while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while command
do
Statement(s) to be executed if command is true
done
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。
以下测试条件是:如果COUNTER小于5,那么返回 true。
- COUNTER=0
- while [ $COUNTER -lt 5 ]
- do
- COUNTER='expr $COUNTER+1'
- echo $COUNTER
- done
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
- echo 'type <CTRL-D> to terminate'
- echo -n 'enter your most liked film: '
- while read FILM
- do
- echo "Yeah! great film the $FILM"
- done
15.Shell until循环
与 while 循环在处理方式上刚好相反, until 循环执行一系列命令直至条件为 true 时停止,循环格式为:
until command
do
Statement(s) to be executed until command is true
done
- a=0
- until [ ! $a -lt 10 ]
- do
- echo $a
- a=`expr $a + 1`
- done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
16.Shell break和continue命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
- while :
- do
- echo -n "Input a number between 1 to 5: "
- read aNum
- case $aNum in
- 1|2|3|4|5) echo "Your number is $aNum!"
- ;;
- *) echo "You do not select a number between 1 to 5, game is over!"
- break
- ;;
- esac
- done
在嵌套循环中,break n命令后面还可以跟一个整数,表示跳出第几层循环:
- for var1 in 1 2 3
- do
- for var2 in 0 5
- do
- if [ $var1 -eq 2 -a $var2 -eq 0 ]
- then
- break 2
- else
- echo "$var1 $var2"
- fi
- done
- done
如上,break 2 表示直接跳出外层循环。
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
- while :
- do
- echo -n "Input a number between 1 to 5: "
- read aNum
- case $aNum in
- 1|2|3|4|5) echo "Your number is $aNum!"
- ;;
- *) echo "You do not select a number between 1 to 5!"
- continue
- echo "Game is over!"
- ;;
- esac
- done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句
- echo "Game is over!"
永远不会被执行。
同样,continue 后面也可以跟一个数字,表示跳出第几层循环。
- NUMS="1 2 3 4 5 6 7"
- for NUM in $NUMS
- do
- Q=`expr $NUM % 2`
- if [ $Q -eq 0 ]
- then
- echo "Number is an even number!!"
- continue
- fi
- echo "Found odd number"
- done
17.Shell函数:Shell函数返回值、删除函数、在终端调用函数
Shell 函数的定义格式如下(关键字 function可以不加):
function function_name () {
list of commands
[ return value ]
}
调用函数只需要给出函数名,不需要加括号。
函数返回值在调用该函数后通过 $? 来获得。
#!/bin/bash
# Define your function here
funcWithReturn(){
echo -n "input a number now!:" #加 -n 取消输出换行
read numb;
rn=`expr $numb + 2`
return $rn
}
funcWithReturn #调用函数 无需带()
ret=$? #使用¥?读取上面的函数返回值
echo "result of funcWithReturn is: $ret"
#函数嵌套:
nestedFunc(){
funcWithReturn #函数内部调用其他函数 函数嵌套
printf %s\\n $?
}
nestedFunc
像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项
- $unset .f function_name
如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。
18.Shell函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...funWithParam(){
echo "参数个数 $# !" # 参数个数
echo "传递给函数的所有参数:$*" # 传递给函数的所有参数
echo "第一个参数 $1 !"
echo "第二个参数 $2 !"
echo "第十个参数 ${10} !" #第十个以上的参数就需要带{}访问了
echo "第十一个参数 ${11} !"
}
#调用函数时,后面跟上参数的列表
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
特殊变量列表
变量
含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数( 命令行参数 )。n 是一个数字,表示第几个参数。
例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数。
$@
传递给脚本或函数的所有参数。
被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数.
退出状态 : $?可以获取上一个命令的退出状态。大部分命令执行成功会返回 0,失败返回 1。($? 也可以表示函数的返回值)
18.Shell输入输出重定向:Shell Here Document,/dev/null文件
Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
输出重定向:命令的输出不仅可以是显示器,还可以很容易的转移向到文件。语法: $ command> file
- $ who > users #将who命令的输出信息定向到文件users里
输出重定向会覆盖文件内容!
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾:
$ echo line 2 >> users
$ cat users
输入重定向和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:$command< file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
注意:输出重定向是大于号(>),输入重定向是小于号(<)。
$ wc -l users #计算 users 文件中的行数
也可以将输入重定向到 users 文件: $ wc -l < users
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:
- $command 2 > file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
- $command 2 >> file
2 表示标准错误文件(stderr)。
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
- $command > file 2>&1 cal > f 2>&1
或
- $command >> file 2>&1
如果希望对 stdin 和 stdout 都重定向,可以这样写:
- $command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
全部可用的重定向命令列表
命令
说明
command > file
将输出重定向到 file。
command < file
将输入重定向到 file。
command >> file
将输出以追加的方式重定向到 file。
n > file
将文件描述符为 n 的文件重定向到 file。
n >> file
将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m
将输出文件 m 和 n 合并。
n <& m
将输入文件 m 和 n 合并。
<< tag
将开始标记 tag 和结束标记 tag 之间的内容作为输入。
19.Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
- command << delimiter
- document
- delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
- 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
- 开始的delimiter前后的空格会被忽略掉。
下面的例子,通过 wc -l 命令计算 document 的行数:
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
也可以 将 Here Document 用在脚本中,例如:
- #!/bin/bash
- cat << EOF
- This is a simple lookup program
- for good (and bad) restaurants
- in Cape Town.
- EOF
运行结果:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
下面的脚本通过 vi 编辑器将 document 保存到 test.txt 文件:
- #!/bin/sh
- filename=test.txt
- vi $filename <<EndOfCommands
- i
- This file was created automatically from
- a shell script
- ^[
- ZZ
- EndOfCommands
运行脚本:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
打开 test.txt,可以看到下面的内容:
$ cat test.txt
This file was created automatically from
a shell script
$
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
- $ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
- $ command > /dev/null 2>&1
20.Shell文件包含
像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。
Shell 中包含脚本可以使用:
- . filename
或
- source filename
两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
例如,创建两个脚本,一个是被调用脚本 subscript.sh,内容如下:
- url="http://see.xidian.edu.cn/cpp/view/2738.html"
一个是主文件 main.sh,内容如下:
- #!/bin/bash
- . ./subscript.sh
- echo $url
执行脚本:
$chomd +x main.sh
./main.sh
http://see.xidian.edu.cn/cpp/view/2738.html
$
注意:被包含脚本不需要有执行权限。
转载于:https://www.cnblogs.com/viviwu/p/5391230.html
Unix/Linux shell脚本编程学习--Shell Script II相关推荐
- shell脚本编程学习笔记6(xdl)——字符串截取命令
shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...
- shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()
shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...
- shell脚本编程学习笔记2(xdl)——Bash变量
shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...
- shell脚本编程学习笔记8(XDL)——流程控制和循环
shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...
- shell脚本编程学习笔记5(xdl)——正则表达式
shell脚本编程学习笔记5--正则表达式 1,简介 正则表达式,用来在文件中匹配符合条件的字符串,包含匹配.注意是文件中选择字符串,和通配符是 不同的.grep,awk,sed等命令可以支持正则表达 ...
- shell脚本编程学习笔记4(xdl)——Bash常见环境变量
shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...
- Linux Shell脚本编程学习笔记和实战
http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...
- Shell脚本编程学习入门
Shell起源于Unix,是Unix和Linux通信的东西 用户和内核之间的"代理",叫做Shell. SHell除了能解释用户输入的命令,把它传递给内核,还可以: 1.调用其他程 ...
- shell脚本编程 学习笔记
1.shell简介 1.1 什么是shell Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一 ...
- shell脚本编程学习笔记7(XDL)——字符处理命令和条件判断
shell编程学习笔记--字符处理命令和条件判断 1,字符处理 [root@localhost ~]# sort [选项] 文件名 选项: -f: 忽略大小写 -n: 以数值型进行排序,默认使用字符串 ...
最新文章
- 【SVN】svn“E155017工作副本的参考文件损坏、E200014文件校验和不匹配”的解决方法
- java读取pdf文件流,系列篇
- 网工路由基础(1)静态路由
- 推荐:个人时间跟踪工具 ManicTime
- Hibernate入门(二)——hibernateAPI详解
- Python动态导入模块、类
- python实现注册登录检验系统的源代码_Django自带的用户验证系统实现
- Python中if-else语句的多种写法
- 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
- javascript学习一、js的初步了解
- C++实例(十一)Excel表格操作
- Java入门数据类型转换(羊驼)
- 联想一体机电源键不亮_联想力压华为拿下6·18 PC“六冠王”,背后有何秘诀?...
- python-matplotlib库绘制饼形图专题(从一般饼状图到内嵌环形图)
- 将数字转化为字符串的两种方法
- Unity VFX粒子系统入门笔记-2-制作简易火焰特效
- 组合博弈游戏 - SG函数和SG定理
- wince+labview+ARM的便携式设备
- 二阶龙格库塔公式推导_[数学]龙格-库塔法
- php基础巩固,PHP基础巩固视频教程下载
热门文章
- Sutherland-Hodgeman多边形裁剪
- WF4.0 基础篇 (二十五)(补充) ActivityFunc 与 InvokeFunc
- JAVA8 之 Stream sorted() 示例
- Maven仓库—Nexus环境搭建及使用
- FL Studio20.8中文完整版本覆盖升级更新说明介绍v20.8.3
- 玩转 Java 动态编译,太秀了~!
- Dubbo 的心跳设计,值得学习!
- 它又又又来了,Fastjson 最新高危漏洞来袭!快升级吧
- 真心干货:一起学习阿里巴巴数据中台实践!首次公开!
- 小米造富神话虚实:平均年薪16万 470亿元期权咋分