shell编程笔记
什么是 Shell 脚本?
最简单的解释,一个 shell 脚本就是一个包含一系列命令的文件。
怎样编写一个 Shell 脚本?
1. 编写一个脚本。
2. 使脚本文件可执行。(chmod,权限为 755 的脚本,则每个人都能执行,和权限为 700 的脚本,只有文件所有者能够执行。)
3. 把脚本放置到 shell 能够找到的地方。
基本格式
#!/bin/bash 【①:第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称】
# 2016/12/14 Tim helloWorld script 【②:脚本内容的说明(#注释)】
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH 【③:主要环境变量的宣告(export:导出环境变量,让随后执行的程序知道)】
echo -e "Hello World! \a \n" 【④:脚本主要内容(echo -e 处理转义字符,如:\a 响铃(“警告” -导致计算机嘟嘟响);\n 换行。】
exit 0 【⑤:执行成果告知 (定义回传值)】
常量与变量
常量
定义:declare -r sum (将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset)
变量
全局变量
定义:variable=value
使用:$variable 或 ${variable}
局部变量
定义:local foo(局部变量)
数组
定义:declare -a a 或 a[1]=foo (使用 -a 选项,declare 命令的这个例子创建了数组 a。)
单个赋值:name[subscript]=value
多个赋值:name=(value1 value2 …)
访问:$ hours
长度:数组长度:${#a[@]};指定数组长度:${#a[100]}
读取键盘收入
read:从标准输入读取数值。
read [-options] [variable...]
read选项
选项 说明
-p prompt 为输入显示提示信息,使用字符串 prompt。
-t seconds 超时. 几秒钟后终止输入。read 会返回一个非零退出状态,若输入超时。
-a array 把输入赋值到数组 array 中。
-d delimiter 用字符串 delimiter 中的第一个字符指示输入结束,而不是一个换行符。
-e 使用 Readline 来处理输入。这使得与命令行相同的方式编辑输入。
-n num 读取 num 个输入字符,而不是整行。
-r Raw mode. 不把反斜杠字符解释为转义字符。
-s Silent mode. 不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这会很有帮助。
-u fd 使用文件描述符 fd 中的输入,而不是标准输入。
shell参数
用$1,$2..分别得到第1,第2..个参数。
程序流程控制
表达式
文件表达式
整型表达式
字符串表达式
逻辑表达式
选择判断结构
if 分支结构
if 语句语法:
if [ 条件判断式 ]; then
commands
elif [ 条件判断式 ]; then
commands...
else
commands
fi
例:
if [ $x = 5 ]; (注意空格和分号)
then echo "x equals 5."
else echo "x does not equal 5."
fi
与if常用的判断式结构 | 描述 |
---|---|
test expression | 相当于if, 可用 ‘$?’ 或 ‘&&’ 及 ‘||’ 来展现整个结果。 |
[ expression ] | 与test命令功能一样。 |
(( expression )) | 为整数设计,支持一套完整的算术计算。 |
[[ expression ]] | 强化的[],里面可以用正则表达式。(string1 =~ regex) |
case 分支结构
case多选语法:
case $变量名 in
[pattern [| pattern]...) commands ;;]...
*)
程序段(最后一个变量内容都会用 * 来代表所有其他值。)
exit 1
;;
esac
例:
#1. Display System Information
#2. Display Disk Space
#3. Display Home Space Utilization
#0. Quit
case $REPLY in
0) echo "Program terminated."
exit
;;
1) echo "Hostname: $HOSTNAME"
uptime
;;
2) df -h
;;
3) if [[ $(id -u) -eq 0 ]]; then
echo "Home Space Utilization (All Users)"
du -sh /home/*
else
echo "Home Space Utilization ($USER)"
du -sh $HOME
fi
;;
*) echo "Invalid entry" >&2
exit 1
;;
esac
模式(一个“)”为终止符) | 描述 |
---|---|
a) | 若单词为“a”,则匹配 |
[[:alpha:]]) | 若单词是一个字母字符,则匹配 |
???) | 若单词只有 3 个字符,则匹配 |
*.txt) | 若单词以“.txt”字符结尾,则匹配 |
*) | 匹配任意单词。把这个模式做为 case 命令的最后一个模式,是一个很好的做法,可以捕捉到任意一个与先前模式不匹配的数值;也就是说,捕捉到任何可能的无效值。 |
执行多个动作
添加的“;;&”的语法允许 case 语句继续执行下一条测试,而不是简单地终止运行。
循环结构
while或until 循环结构
while/until 循环语法:
while/until [ 条件判断式 ];
do
commands
done
例:
# while-count: display a series of numbers
count=1
while [ $count -le 5 ];
do
echo $count
count=$((count + 1))
done
for 循环结构
for语法: 传统 shell 格式(循环word2..次)
for variable in word1 word2...;
do
commands
done
例:
for i in {A..D};
do
echo $i
done
for语法: C 语言格式
for (( 初始化表达式;; 循环条件表达式;; 循环后的操作表达式 ));
do
commands
done
例:
for (( i=0; i<5; i=i+1 ));
do
echo $i
done
跳转结构
break
break命令立即终止一个循环,且程序继续执行循环之后的语句
continue
continue 命令导致程序跳过循环中剩余的语句,且程序继续执行下一次循环。
方法
function语法
function fname(){
程序段
}
例:
function hello() {
echo -n "hello!" #加上 -n 可以不断行继续在同一行显示
}
疑难排解
vi/vim编辑器辅助 :syntax on (语法高亮生效)
追踪
全局:#!/bin/bash -x
局部:set -x 开启,set +x 关闭。
set -x # Turn on tracing
if [ $number = 1 ]; then
echo "Number is equal to 1."
else
echo "Number is not equal to 1."
fi
set +x # Turn off tracing
我们使用 set 命令加上 -x 选项来启动追踪,+x 选项关闭追踪。这种技术可以用来检查一个有错误的脚本的多个部分。
sh命令
sh [-nvx] scripts.sh
选项与参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!