shell脚本基础(备忘)
2013-03-18 21:00
357 查看
1、条件测试
两种格式: test condition 或 [ condition ](注意两边加了空格)condition可以是多个子条件的逻辑运算,逻辑运算符号有以下几种:
-a 逻辑与
-o 逻辑或
! 逻辑否
&&, ||
【实例】
$ ls aaa && echo "yes" || echo "no"
有文件aaa时会输出yes,否则输出no
2、文件测试
文件测试利用条件测试的方式测试一个文件或者目录的状态,如是否存在、是否可读等,具体的测试参数如下:-d 目录
-f 普通文件(Regular file)
-L 符号链接
-r Readable(文件、目录可读)
-b 块专用文件
-e 文件存在
-g 如果文件的set-group-id位被设置则结果为真
-s 文件长度大于0,非空
-z 文件长度=0
-w Writable(文件、目录可写)
-u 文件有suid位设置
-x Executable(文件可执行、目录可浏览)
-c 字符专用文件
-L 符号链接
例如测试文件file.txt是否存在,可以这样测试:
$test -e file.txt 或者 [ -e file.txt ]
3、字符串测试
字符串测试可以测试字符串是否为空,测试两个字符串是否相等等,具体的测试参数如下:= 两字符串相等
!= 两字符串不等
-z 空串 [zero]
-n 非空串 [nozero]
4、数值测试
数值测试用于测试两个参数的大小、相等等情况,格式是:“number” numberic_operator “number” 或 [ “number” numberic_operator “number”],numberic_operator取值如下:-eq 数值相等(equal)
-ne 不等(not equal)
-gt A>B(greater than)
-lt A<B(less than)
-le A<=B(less、equal)
-ge A>=B(greater、equal)
(疑问:好像不能用一个变量跟一个数值常量比较,要将值赋给变量然后比较两个变量,待考证!)
5、if结构
if 条件1then
命令1
elif 条件2
then
命令2
else
命令3
fi
6、case结构
case variable inpattern [| pattern] …..) #匹配模式之间用"|"隔开
命令….
;;
模式2)
命令…..
;;
*) #匹配所有
…….
;;
esac
7、for结构
for 变量名 in 列表do
命令1
命令2
done
例子:
用于数值序列:
for loop in 1 2 3 4 5
for i in {1..10}
for ((i = 1; i <= 10; i++))
用于字符串序列:
for loop in “orange red blue grey”
用于命令的执行结果:
for loop in `ls`
无限循环:
for files in *
8、until结构
until conditiondo
命令…..
done
9、while结构
while conditiondo
命令1
命令2
done
10、bash 的组数(array)
一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的符串,但是改为 A=(a b c def) ,则是将 $A 定义为组数...
bash 的组数替换方法可参考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)
A[3]=xyz 则是将第四个组数重新定义为 xyz ...
11、三个重要符号
hard quote:' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。
escape : \ (反斜杠),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。
例如:命令echo '$0 outside function is '$0,第一个$0不会解开,直接输出字符"$0",而第二个$0会被解开,输出当前shell script的路径;
如果用命令echo "$0 outside function is "$0,则两个$0都会被解开,因此不能达到想要的结果。
(注意:在vim中编写shell script时,vim的颜色提示就可以看出符号是否解开,即是按普通字符串处理,还是按meta处理)
12、读取文件
读取文件的一行:read str < file.txt逐行读取文件
while read line
do
echo $line
done < file.txt
13、执行数值计算的三种方式
num1=123 num2=100 #(1)declare声明方式 declare -i sum=$num1+$num2 #(2)$(())操作符方式 sum=$((num1 + num2)) #(3)expr命令方式,$()为执行命令,expr是计算命令 sum=$(expr $num1 + num2 ) 注意:方式1中+左右不能有空格,方式2可有可无,方式3中必须加空格,否则会按字符串方式连接; 另外,方式2中变量前的$符号可以省略。
14、shell变量详解(变量高级内容)
http://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html计算字符串长度:
${#string}
抽取子串:
${string:position} #从名称为$string的字符串的第$position个位置开始抽取子串
${string:position:length} #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
删除子串:
${string#substring} #删除string开头处与substring匹配的最短子串
${string##substring} #删除string开头处与substring匹配的最长子串
${string%substring} #删除string结尾处与substring匹配的最短子串
${string%%substring} #删除string结尾处与substring匹配的最长子串
替换子串:
替换子串命令都是${…}格式,可以在任意处、开头处和结尾处替换满足条件的子串
${string/substring/replacement} #仅替换第一次与substring相匹配的子串
${string//substring/replacement} #替换所有与substring相匹配的子串
${string/#substring/replacement} #替换string开头处与substring相匹配的子串
${string/%substring/replacement} #替换string结尾处与substring相匹配的子串
【其他杂项】
( ):将其内的命令置于 nestedsubshell 执行,或用于运算或命令替换。(变量修改是临时的){ }:将其内的命令置于 non-namedfunction 中执行,或用在变量替换的界定范围。(变量修改对本shell有效)
${ }或` `(反引号):用来做命令替换,也就是执行括号里面的命令行,然后返回命令行执行的结果。
$(( )):用来做整数计算。如:
$ a=5; b=7; c=2
$ echo $(( a+b*c ))
(( )):可重定义变量值,或作条件测试。如:
a=5; ((a++)) 可将 $a 重定义为 6
a=5; b=7; ((a < b)) 会得到0 (true) 的返回值。
命令、函数或者shell脚本的返回值只有两种:0为"真"( true ),非0为"假"( false )
$#: 添加到Shell的参数个数
$$: Shell本身的PID(ProcessID)
$!: Shell最后运行的后台Process的PID
$?: 最后运行的命令的结束代码(返回值)
$*: 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@: 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
为了防止打错变量名造成错误检查困难,可以设置:变量必须先声明(定义)才能使用!可以打开shell的选项(OPTNAME)nounset,关于选项可以执行set -o列出。打开该选项可以执行:set -o nounset 或者 shopt -s -o nounset
相关文章推荐
- Shell脚本之awk篇(基础)
- shell基础:使用read、命令行脚本传参实现输入2个整数并计算
- shell脚本编程基础知识
- shell基础-脚本执行方式
- Linux 基础命令(六)—— SHELL脚本编程基础
- shell基础脚本
- Shell 脚本基础学习 (三)
- bash的多命令执行,shell脚本基础及grep系
- [备忘]liunx下shell脚本通过IP授权方法
- 第9课shell脚本基础2-条件测试及控制流
- Linux脚本shell编写基础
- shell脚本基础
- shell脚本部分基础详解
- shell脚本基础知识(上)
- Shell脚本编程基础 三 使用结构化命令
- 学习shell脚本之前的基础知识
- shell脚本基础知识(下)
- shell 脚本-符号-基础语法
- Shell脚本入门基础
- SHELL脚本的基础知识5——显示数据