Shell 摘记

输出重定向:

>> $HOME/log/SB-`date +%Y%m%d`.log 2>&1





1.定义变量

定义变量时,变量名不加美元符号($),如:

hellosb=“sb”;

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。


2.使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如

hellosb=“sb”;

echo $hellosb

echo ${hellosb}


3.重新定义变量

已定义的变量,可以被重新定义,如

hellosb=“sb”

echo ${hellosb}

hellosb="you are sb"

echo ${hellosb}


4.只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash
hellosb="sb"
readonly hellosb
hellosb="you are sb"

运行脚本,结果如下:
./biubiu.sh: 第 6 行:unset: hellosb: 无法反设定: 只读 variable


5.删除变量

使用 unset 命令可以删除变量。

#!/bin/bash
hellosb="sb"
unset hellosb
echo ${hellosb}

运行脚本,没有任何输出


6.特殊变量


                     

$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。


7.命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。

命令替换语法:

`commnd`

注意是反引号,不是单引号,这个键位于 Esc 键下方。

#!/bin/bash

DATE=`date`

echo"当前时间是 $DATE"

运行脚本:



8.变量替换

     


9.运算符

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加:

#!/bin/bash

val=`expr 2 + 2`

echo "Total value : $val"
运行脚本输出:

Total value : 4

两点注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边
 

         

                  

       


10.注释

     以“#”开头的行就是注释,会被解释器忽略。sh里没有多行注释,只能每一行加一个#号。但是可以把需要注释的部分定义成函数,不调用这个函数,就能达到注释的目的。

  #!/bin/bash

nofunction(){

echo "hello"

}

执行脚本,没有输出;


11.字符串

单引号:

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号:

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
拼接字符串:


获取、提取、查找字符串长度:



12.数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
    array_name=(value1 ... valuen)

读取数组

读取数组元素值的一般格式是:
    ${array_name[index]}

获取数组长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}




13.echo

显示转义字符

echo "\"hello world\""

执行脚本,输出

"hello world"

输出换行\n   

echo "hello!\n"

echo "world"        

执行结果 hello

               world

输出不换行\c

echo "hello!\c"

echo "world"        执行结果helloworld

原样输出

echo '$name\"'    执行结果 'sb'

从上面可看出,双引号可有可无,单引号主要用在原样输出中。


14.printf 格式化输出

printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。注意:printf 由 POSIX 标准所定义,移植性要比 echo 好。
如同 echo 命令,printf 命令也可以输出简单的字符串:

printf "Hello, Shell\n"
Hello, Shell

printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。

printf 命令的语法:

printf  format-string  [arguments...]
format-string 为格式控制字符串,arguments 为参数列表。

printf()在C语言入门教程中已经讲到,功能和用法与 printf 命令类似,请查看:C语言格式输出函数printf()详解

这里仅说明与C语言printf()函数的不同:

  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号

# format-string为双引号
printf "%d %s\n" 1 "hello"
1 hello
# 单引号与双引号效果一样 
printf '%d %s\n' 1 "hello" 
1 hello
# 没有引号也可以输出
printf %s hello
hello
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
abcdef
printf "%s\n" abc def
abc
def
printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" 
and 0
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'

注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。


14.if else语句

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

  • if ... fi 语句;
  • if ... else ... fi 语句;
  • if ... elif ... else ... fi 语句。

1) if ... else 语句

if ... else 语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
fi
如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。


2) if ... else ... fi 语句

if ... else ... fi 语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi
如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。

3) if ... elif ... fi 语句

if ... elif ... fi 语句可以对多个条件进行判断,语法为:

if [ expression 1 ]
then
   Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

哪一个 expression 的值为 true,就执行哪个 expression 后面的语句;如果都为 false,那么不执行任何语句。


if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
if test $[2*3] -eq $[1+5]; then echo '这个两个相等!'; fi;

test 命令用于检查某个条件是否成立,与方括号([ ])类似。


16. case esac语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。


另个例子:
option=$1
case $option in
-f) FILE="$2"
echo "File name is $FILE"
;;
-d) DIR="$2"
echo "Dir name is $DIR"
;;
*)
echo "`basename $0`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
执行脚本,结果如下:
[root@localhost shell]# ./biubiu.sh -f ab
File name is ab
[root@localhost shell]# ./biubiu.sh -d cd
Dir name is cd


17. for循环

for循环一般格式为:
for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:
for sb in 1 2 3 4 5
do
echo "The value is: $sb"
done

执行脚本,结果如下:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5


显示主目录下以 .bash 开头的文件:



18.while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while command
do
   Statement(s) to be executed if command is true
done
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。
以下是一个基本的while循环,测试条件是:如果num小于5,那么返回 true。num从0开始,每次循环处理时,num加1。运行上述脚本,返回数字1到5,然后终止。


while循环可用于读取键盘信息。



19.until

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用

until 循环格式为:

until command
do
   Statement(s) to be executed until command is true
done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。



20.break 与continue

break命令允许跳出所有循环(终止执行后面的所有循环)。

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。


21.函数

hell 函数的定义格式如下:
function_name () {
    list of commands
    [ return value ]
}
如果你愿意,也可以在函数名前加上关键字 function:
function function_name () {
    list of commands
    [ return value ]
}
函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。

调用函数只需要给出函数名,不需要加括号。

像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 -f 选项,如下所示:$unset -f function_name

函数参数

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值