shell 语法
时间:2006-06-26 来源:huanghaojie
1.shell执行选项
-n 测试shell script语法结构,只读取shell script但不执行
-n string is not "null". -x 进入跟踪方式,显示所执行的每一条命令,用于调度
-a Tag all variables for export
-c "string" 从strings中读取命令
-e 非交互方式
-f 关闭shell文件名产生功能
-h locate and remember functions as defind
-i 交互方式
-k 从环境变量中读取命令的参数
-r 限制方式
-s 从标准输入读取命令
-t 执行命令后退出(shell exits)
-u 在替换中如使用未定义变量为错误
-v verbose,显示shell输入行
2.传递一个间接引用给函数
message=Hello
Hello=Goodbye
echo_var "$message" # Hello
echo_var "${!message}" # Goodbye
3.exec 用法
#exec ls -l 执行ls -l命令后退出当前shell
4.控制字符
修改终端或文本显示的行为.控制字符以CONTROL + key 组合.
控制字符在脚本中不能正常使用.
Ctl-B 光标后退,这应该依赖于bash 输入的风格,默认是emacs 风格的.
Ctl-C Break,终止前台工作.
Ctl-D 从当前shell 登出(和exit 很像)
"EOF"(文件结束符).这也能从stdin 中终止输入.
在console 或者在xterm window 中输入的时候,Ctl-D 将删除光标下字符.
当没有字符时,Ctrl-D 将退出当前会话.在xterm window 也有关闭窗口
的效果.
Ctl-G beep.在一些老的终端,将响铃.
Ctl-H backspace,删除光标前边的字符.如:
1 #!/bin/bash
2 # 在一个变量中插入Ctl-H
3
4 a="^H^H" # 两个 Ctl-H (backspaces).
5 echo "abcdef" # abcdef
6 echo -n "abcdef$a " # abcd f
7 # 注意结尾的空格 ^ ^ 两个 twice.
8 echo -n "abcdef$a" # abcdef
9 # 结尾没有空格 没有 backspace 的效果了(why?).
10 # 结果并不像期望的那样
11 echo; echo
Ctl-I 就是tab 键.
Ctl-J 新行.
Ctl-K 垂直tab.(垂直tab?新颖,没听过)
作用就是删除光标到行尾的字符.
Ctl-L clear,清屏.
Ctl-M 回车
5.重定向
stdin, stdout, 和stderr 的文件描述符分别
是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3 到9.
1): > filename
# > 会把文件"filename"截断为0 长度.
# 如果文件不存在, 那么就创建一个0 长度的文件(与'touch'的效果相同).
# : 是一个占位符, 不产生任何输出.
2) 1>filename
# 重定向stdout 到文件"filename".
1>>filename
# 重定向并追加stdout 到文件"filename".
3) 2>filename
# 重定向stderr 到文件"filename".
2>>filename
# 重定向并追加stderr 到文件"filename".
4) &>filename
# 将stdout 和stderr 都重定向到文件"filename".
5)2>&1
# 重定向stderr 到stdout.
i>&j
# 重定向文件描述符i 到 j.
# 指向i 文件的所有输出都发送到j 中去
>&j
# 默认的, 重定向文件描述符1(stdout)到 j.
# 所有传递到stdout 的输出都送到j 中去.
[j]<>filename
# 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
# 如果文件"filename"不存在, 那么就创建它.
# 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
#
# 这种应用通常是为了写到一个文件中指定的地方.
echo 1234567890 > File # 写字符串到"File".
exec 3<> File # 打开"File"并且给它分配fd 3.
read -n 4 <&3 # 只读4 个字符.
echo -n . >&3 # 写一个小数点.
exec 3>&- # 关闭fd 3.
cat File # ==> 1234.67890
6)删除一个文件的内容, 但是保留文件本身, 和所有的文件权限:
1 cat /dev/null > /var/log/messages
2 # : > /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)
6.#echo $$ >tmp$$ $$ 表示当然终端的PID
7.函数调用和return 运用
更进一步的问题是如何给函数传递参数和获得返回值。BASH 中函数参数的定义并不需要在函数 定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;BASH 的返回值可以用 return 语句来 指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回 错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。下面我们就来看一个用函数来计算整数平方的例子:
#!/bin/bash
square() {
let "res = $1 * $1"
return $res #记住res值,然后通过$?来调用。
}
square $1
result=$?
echo $result
exit 0
8.Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量
-n 测试shell script语法结构,只读取shell script但不执行
-n string is not "null". -x 进入跟踪方式,显示所执行的每一条命令,用于调度
-a Tag all variables for export
-c "string" 从strings中读取命令
-e 非交互方式
-f 关闭shell文件名产生功能
-h locate and remember functions as defind
-i 交互方式
-k 从环境变量中读取命令的参数
-r 限制方式
-s 从标准输入读取命令
-t 执行命令后退出(shell exits)
-u 在替换中如使用未定义变量为错误
-v verbose,显示shell输入行
2.传递一个间接引用给函数
message=Hello
Hello=Goodbye
echo_var "$message" # Hello
echo_var "${!message}" # Goodbye
3.exec 用法
#exec ls -l 执行ls -l命令后退出当前shell
4.控制字符
修改终端或文本显示的行为.控制字符以CONTROL + key 组合.
控制字符在脚本中不能正常使用.
Ctl-B 光标后退,这应该依赖于bash 输入的风格,默认是emacs 风格的.
Ctl-C Break,终止前台工作.
Ctl-D 从当前shell 登出(和exit 很像)
"EOF"(文件结束符).这也能从stdin 中终止输入.
在console 或者在xterm window 中输入的时候,Ctl-D 将删除光标下字符.
当没有字符时,Ctrl-D 将退出当前会话.在xterm window 也有关闭窗口
的效果.
Ctl-G beep.在一些老的终端,将响铃.
Ctl-H backspace,删除光标前边的字符.如:
1 #!/bin/bash
2 # 在一个变量中插入Ctl-H
3
4 a="^H^H" # 两个 Ctl-H (backspaces).
5 echo "abcdef" # abcdef
6 echo -n "abcdef$a " # abcd f
7 # 注意结尾的空格 ^ ^ 两个 twice.
8 echo -n "abcdef$a" # abcdef
9 # 结尾没有空格 没有 backspace 的效果了(why?).
10 # 结果并不像期望的那样
11 echo; echo
Ctl-I 就是tab 键.
Ctl-J 新行.
Ctl-K 垂直tab.(垂直tab?新颖,没听过)
作用就是删除光标到行尾的字符.
Ctl-L clear,清屏.
Ctl-M 回车
5.重定向
stdin, stdout, 和stderr 的文件描述符分别
是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3 到9.
1): > filename
# > 会把文件"filename"截断为0 长度.
# 如果文件不存在, 那么就创建一个0 长度的文件(与'touch'的效果相同).
# : 是一个占位符, 不产生任何输出.
2) 1>filename
# 重定向stdout 到文件"filename".
1>>filename
# 重定向并追加stdout 到文件"filename".
3) 2>filename
# 重定向stderr 到文件"filename".
2>>filename
# 重定向并追加stderr 到文件"filename".
4) &>filename
# 将stdout 和stderr 都重定向到文件"filename".
5)2>&1
# 重定向stderr 到stdout.
i>&j
# 重定向文件描述符i 到 j.
# 指向i 文件的所有输出都发送到j 中去
>&j
# 默认的, 重定向文件描述符1(stdout)到 j.
# 所有传递到stdout 的输出都送到j 中去.
[j]<>filename
# 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
# 如果文件"filename"不存在, 那么就创建它.
# 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
#
# 这种应用通常是为了写到一个文件中指定的地方.
echo 1234567890 > File # 写字符串到"File".
exec 3<> File # 打开"File"并且给它分配fd 3.
read -n 4 <&3 # 只读4 个字符.
echo -n . >&3 # 写一个小数点.
exec 3>&- # 关闭fd 3.
cat File # ==> 1234.67890
6)删除一个文件的内容, 但是保留文件本身, 和所有的文件权限:
1 cat /dev/null > /var/log/messages
2 # : > /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)
6.#echo $$ >tmp$$ $$ 表示当然终端的PID
7.函数调用和return 运用
更进一步的问题是如何给函数传递参数和获得返回值。BASH 中函数参数的定义并不需要在函数 定义处就制定,而只需要在函数被调用时用 BASH 的保留变量 $1 $2 ... 来引用就可以了;BASH 的返回值可以用 return 语句来 指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回 错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。下面我们就来看一个用函数来计算整数平方的例子:
#!/bin/bash
square() {
let "res = $1 * $1"
return $res #记住res值,然后通过$?来调用。
}
square $1
result=$?
echo $result
exit 0
8.Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量
表示方法 | 描述 |
---|---|
$n | $1 表示第一个参数,$2 表示第二个参数 ... |
$# | 命令行参数的个数 |
$0 | 当前程序的名称 |
$? | 前一个命令或函数的返回码 |
$* | 以"参数1 参数2 ... " 形式保存所有参数 |
$@ | 以"参数1" "参数2" ... 形式保存所有参数 |
$$ | 本程序的(进程ID号)PID |
$! | 上一个命令的PID |
相关阅读 更多 +