bash笔记-05-命令
时间:2006-07-26 来源:zzzppp
可以在脚本中调用命令. bash命令可分为外部命令和内部命令(bash内嵌的命令).可以在命令行中直接调用外部命令,但不能直接调用内部命令.但根据POSIX标准,许多内 嵌命令已经被实现为独立的外部程序.所以区别内部命令和外部命令的意义就不大了.只需知道内部命令执行起来比外部命令效率更高就可以了. 另外, 外部命令和内嵌命令的执行方式也不一样, 参考bash笔记-01-intro
循环控制
break
break用于循环控制, 可在for, while, until中在条件满足之前提前终止语句的执行. 还可使用"break n"用以结束n层循环, 但理解它比较麻烦, 现实意义也不大, 不推荐使用. 默认break只用于退出一层循环.
continue
与break相对应, continue用以跳出当前循环, 进入到下一次循环中. loop变量取下此婚还的值. 也可以调用"continue n"来跳出嵌套循环, 同样, 不推荐使用.
例: (来自abs, 10.3节)
: 命令
":"是一个空命令(null), 有时它被用来简化控制逻辑. 它实际上是true的别名. 例如:
用于无限循环的 "while :" 实际上等价于"while true". ":"由于是内嵌命令, 它比true效率要高.
I/O
echo
echo向stdout输出表达式或变量. 默认地, echo会在输出后换行. 可以有两种方式关闭echo的换行:
$ echo -n "hello, world"
$ echo -e "hello, world\c"
-n去掉echo末尾的换行符, -e打印出转义字符. 在linux/bash系统中, 推荐使用-n.
printf
如果想生成格式化输出, 建议使用printf而非echo. 老版本的bash不支持printf, 但教新的都支持.
printf和c中的printf函数很像:
printf “format string” parameter1 parameter2 ...
但bash中的printf不能输出浮点数(bash中的算术运算都是针对整数执行的).
$ printf "%s %d\t %s\n" "hi there" 15 "people"
hi there 15 people
脚本行为
source, . 命令
在bash笔记第一部分中已经提到了source命令或.命令对脚本的执行方式与其他执行方式的不同指出: 在当前shell中运行, 影响当前shell的环境变量. 可以把"."命令想象成C中的#include命令, 虽然它不直接将语句包含到脚本中, 但它会在当前shell中执行那些命令. 使用.命令可以将多个脚本合并起来, 整合进一些变量和函数.
exec
exec有两种用途:
1, 让当前进程执行其他的命令.
注意: (1)它不声称一个子shell进程, 而是在当前进程执行程序.
(2)在exec命令之后的shell语句不会被执行, exec命令执行的程序运行完毕后就会退出.
2, 重分配文件描述符. (不常用)
$ exec 3< file
将fd=3用于读取file.
exit
用于无条件终止当前脚本的执行. 若用在交互式shell中, 它将logout当前shell.
exit后经常带有一个数值参数, 表征退出状态: exit n
n == 0 脚本执行成功
n == 1~125 出错, 这些对应的错误值由用户在脚本中定义.
n == 126 文件不可执行
n == 127 不存在该命令
n >= 128 产生信号
注意n处于1到125的情况, 这些错误值可以由用户自定义, 这就不需要使用类似C中errno这样的全局变量.
如果不给定n的值, 而直接使用exit, 那么返回exit之前最后一条语句的状态. 等效于"exit $?".
return
return用于函数的返回, 它向调用该函数的脚本返回一个整数数值. 若未给出该数值, 默认返回return前执行的最后一条命令的返回值.
export
export用来向当前shell或脚本的子进程输出变量. 包括子进程的子进程, 无限嵌套...
变量相关
set
set被用来设置bash的内置变量.
1, set可被用来重设某条命令的位置参数, 例如:
$ date
$ set $(date)
$ echo "the month is $2
the month is Jul
上述命令将位置参数设置为与date命令的输出相关.
2, 直接调用$ set , 将显示所有的环境变量和局部变量. 在调试bash脚本中, set也大有用武之地.
unset
unset被用来删除一个变量(该变量的值被设为null)
例如:
$ unset PATH
$ echo $PATH
unset不能删除bash内部定义的只读变量, 比如位置参数.
$ unset foo 与 $ foo= 的区别:
后者只是将foo设置为null, 前者将foo从环境变量中删除.
命令的执行
在编写脚本时, 我们时常需要在脚本中用到命令执行的结果, 即将变量执行的结果放到一个变量中. 这通过$(command)来实现.
$ (command)即为command执行的结果, 例:
$ echo "the current dir is $PWD"
$ echo "the date is $(date)"
当然, 也可以将命令执行的结果赋给一个变量:
$ DATE=$(date)
$ echo $DATE
循环控制
break
break用于循环控制, 可在for, while, until中在条件满足之前提前终止语句的执行. 还可使用"break n"用以结束n层循环, 但理解它比较麻烦, 现实意义也不大, 不推荐使用. 默认break只用于退出一层循环.
continue
与break相对应, continue用以跳出当前循环, 进入到下一次循环中. loop变量取下此婚还的值. 也可以调用"continue n"来跳出嵌套循环, 同样, 不推荐使用.
例: (来自abs, 10.3节)
#!/bin/bash |
: 命令
":"是一个空命令(null), 有时它被用来简化控制逻辑. 它实际上是true的别名. 例如:
用于无限循环的 "while :" 实际上等价于"while true". ":"由于是内嵌命令, 它比true效率要高.
I/O
echo
echo向stdout输出表达式或变量. 默认地, echo会在输出后换行. 可以有两种方式关闭echo的换行:
$ echo -n "hello, world"
$ echo -e "hello, world\c"
-n去掉echo末尾的换行符, -e打印出转义字符. 在linux/bash系统中, 推荐使用-n.
printf
如果想生成格式化输出, 建议使用printf而非echo. 老版本的bash不支持printf, 但教新的都支持.
printf和c中的printf函数很像:
printf “format string” parameter1 parameter2 ...
但bash中的printf不能输出浮点数(bash中的算术运算都是针对整数执行的).
$ printf "%s %d\t %s\n" "hi there" 15 "people"
hi there 15 people
脚本行为
source, . 命令
在bash笔记第一部分中已经提到了source命令或.命令对脚本的执行方式与其他执行方式的不同指出: 在当前shell中运行, 影响当前shell的环境变量. 可以把"."命令想象成C中的#include命令, 虽然它不直接将语句包含到脚本中, 但它会在当前shell中执行那些命令. 使用.命令可以将多个脚本合并起来, 整合进一些变量和函数.
exec
exec有两种用途:
1, 让当前进程执行其他的命令.
注意: (1)它不声称一个子shell进程, 而是在当前进程执行程序.
(2)在exec命令之后的shell语句不会被执行, exec命令执行的程序运行完毕后就会退出.
2, 重分配文件描述符. (不常用)
$ exec 3< file
将fd=3用于读取file.
exit
用于无条件终止当前脚本的执行. 若用在交互式shell中, 它将logout当前shell.
exit后经常带有一个数值参数, 表征退出状态: exit n
n == 0 脚本执行成功
n == 1~125 出错, 这些对应的错误值由用户在脚本中定义.
n == 126 文件不可执行
n == 127 不存在该命令
n >= 128 产生信号
注意n处于1到125的情况, 这些错误值可以由用户自定义, 这就不需要使用类似C中errno这样的全局变量.
如果不给定n的值, 而直接使用exit, 那么返回exit之前最后一条语句的状态. 等效于"exit $?".
return
return用于函数的返回, 它向调用该函数的脚本返回一个整数数值. 若未给出该数值, 默认返回return前执行的最后一条命令的返回值.
export
export用来向当前shell或脚本的子进程输出变量. 包括子进程的子进程, 无限嵌套...
变量相关
set
set被用来设置bash的内置变量.
1, set可被用来重设某条命令的位置参数, 例如:
$ date
$ set $(date)
$ echo "the month is $2
the month is Jul
上述命令将位置参数设置为与date命令的输出相关.
2, 直接调用$ set , 将显示所有的环境变量和局部变量. 在调试bash脚本中, set也大有用武之地.
unset
unset被用来删除一个变量(该变量的值被设为null)
例如:
$ unset PATH
$ echo $PATH
unset不能删除bash内部定义的只读变量, 比如位置参数.
$ unset foo 与 $ foo= 的区别:
后者只是将foo设置为null, 前者将foo从环境变量中删除.
命令的执行
在编写脚本时, 我们时常需要在脚本中用到命令执行的结果, 即将变量执行的结果放到一个变量中. 这通过$(command)来实现.
一些老脚本中利用$`command`而非$ (command), 注意是`(esc下面的那个键盘)而非'(强引用)! 最好使用$ (command). |
$ (command)即为command执行的结果, 例:
$ echo "the current dir is $PWD"
$ echo "the date is $(date)"
当然, 也可以将命令执行的结果赋给一个变量:
$ DATE=$(date)
$ echo $DATE
相关阅读 更多 +