shell基础
shell
1、shell中的特殊变量
1-1、特殊变量
1-2、$* 和 $@
$* 和 $@ 的区别为: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
1-3、$?
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。
2、echo 的选项
2-1、-e
用后面的内容对转义字符进行替换
例:echo -e "\\" 结果:\
echo -e "\\\\" 结果:\
echo -e "\1abc\\de\\\2fgh\\\\ijklmn" 结果:\1abc\de\2fgh\ijklmn
2-2、-n
禁止插入换行符(包括echo自带的换行符也将失效)
2-3、-E
禁止转义字符,但对"\\"无效
3、变量
3-1、只读变量
readonly 变量
3-2、删除变量
unset 变量
4、替换
4-1、命令替换
把一个命令的输出赋值给一个变量,方法为把命令用反引号(在Esc下方)引起来
例:
result=`pwd`
echo $result
结果:
/home/sl
4-2、变量替换
5、运算符
5-1、算术运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr. 下面使用expr进行; expr是一款表达式计算工具,使用它可以完成表达式的求值操作;
注意:
1. 在expr中的乖号为:\*
2. 在 expr中的 表达式(或者变量)与运算符之间要有空格,否则错误;
3. 在[ $a == $b ]与[ $a != $b ]中,要需要在方括号与变量以及变量与运算符之间也需要有空格, 否则为错误的。
4、表达式必须用反引号括起来
5-2、关系运算符
5-3、布尔运算符
5-4、字符串运算符
5-5、文件测试运算符
6、字符串
6-1、单引号的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
- 双引号里可以有变量
- 双引号里可以出现转义字符
6-2、双引号的优点:
6-3、字符串操作
1、字符串长度
${#str}
2、子串
${str:1:4}
3、字符串是否包含子串
expr index "$str" substr
4、路径字符串
4-1、basename
得到文件名
例:
result=`basename /home/sl/a.sh`
echo $result
结果:a.sh
result=`basename /home/sl `
echo $result
结果:sl
4-2、dirname
得到路径名
例:
result=`basename /home/sl/a.sh`
echo $result
结果:/home/sl
result=`basename /home/sl `
echo $result
结果:/home
7、数组
7-1、定义
1、在shell中用括号表示数组,元素用空格分开
2、下标从0开始,可以使用不连续的下标,而且下标的范围没有限制,但不许是自然数
7-2、读取数组的全部元素,用@或*
${array_name[*]}或者${array_name[@]}
7-3、数组的长度
${#array_name[*]}或者${#array_name[@]}
7-4、获取数组的所有下标
${!array_name[*]}或者${#array_name[@]}
7-5、获取数组元素的长度
${#array_name[i]}
8、函数
8-1、printf
- printf 命令不用加括号
- format-string 可以没有引号,但最好加上,单引号双引号均可。
- 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
- arguments 使用空格分隔,不用逗号。
Ø 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
8-2、exit
退出shell
8-3、read
从键盘读取
-p:输入提示
-t:输入等待计时
-n:输入字符个数控制
-s:输入不显示在监视器上(实际上数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)
read line:读文件
- 可以使用read命令读取Linux系统上的文件。
每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。
读取文件的关键是如何将文本中的数据传送给read命令。
最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令
#!/bin/bash
count=1 //赋值语句,不加空格
cat test | while read line //cat 命令的输出作为read命令的输入,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ] //注意中括号中的空格。
done
echo "finish"
exit 0
8-4、
9、语句
9-1、if语句
if [ 表达式] then 语句 elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句 ……else 语句 fi
例:
if [ $a == $b ]
then
echo "a等于b"
else
echo "a!=b"
fi
或者
if [ $a == $b ]; then echo "a==b"; else echo "a!=b"; fi;
9-2、case语句
取值后面必须为关键字 in,每一模式必须以右括号结束。
;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。2. 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
read -t 30 -p "please input your digit:" a
case $a in
1)
echo "a==1";;
2)
echo "a==2";;
3)
echo "a==3";;
*)
echo "a > 3";;
esac
9-3、循环语句
1、for
for 变量 in 列表
do
……
done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。
for FILE in $HOME/*.sh
do
echo $FILE
done
2、while
while command
do
Statement(s) to be executed if command is true
done
i=0
while [ $i -lt 5 ]
do
i=`expr $i+1`
echo $i
done
3、until
until command
do
……
done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
until [ $i -gt 10 ]
do
echo $i
i=`expr $i + 1`
done
10、函数
1、定义
function_name () {
list of commands
[ return value ]
}
也可以加上function关键字:
function function_name () {
list of commands
[ return value ]
}
1. 调用函数只需要给出函数名,不需要加括号。
2. 函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
3. Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。
4. 函数的参数可以通过 $n
5、定义的时候不用写参数
2、调用
function_name 参数列表(空格分开)
3、删除函数
unset .f function_name
11、引入外部脚本
. filename
#或
source filename
1. 两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
2. 被包含脚本不需要有执行权限。