shell学习笔记

1. shell脚本参数

$n 表示传递给脚本的第n个参数,例如$1 表示第1个参数,$2表示第2个参数….$# 命令行参数的个数$0 当前脚本的名称$* 以“参数1 参数2 参数3…”的形式返回所有参数的值$@ 以“参数1”“参数2”“参数3”…的形式返回所有参数的值$_ 保存之前执行的命令的最后一个参数$? 前一个命令或者函数的返回状态码$$ 返回本程序的进程ID(PID)

注:变量$@可以以“参数1”“参数2”“参数3”..的形式返回所有的参数的值,因此,$@与“$1””$2″”$3″…是等价的;如果用户传递的参数中包含空格或者其他的特殊字符,需要使用$@来获取所有的参数的值,不能使用$*。


2. 变量和引用

在shell中,变量名的大小写是敏感的,因此,大小写不同的两个变量名并不代表同一个变量。m=${x/acd/1}—将x中的acd变成1并赋值给m。

# x=acdqw12# m=${x/acd/1}# echo $m#m=1qw12

3种引号的不同:单引号(”)括起来的字符都作为普通字符出现–全引用;双引号(“”)括起来的字符除“$” “\” “’” “””这几个字符仍保留其特殊功能外,其余字符仍作为普通字符对待–部分引用;反引号(“)括起来的字串被shell解释为命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号部分。反斜线“\”称为转义字符,用于将一些shell中的特殊字符转换为普通字符,例如“$”或者“’”等.

# echo $SHELL# /bin/bash;# echo \$SHELL# $SHELL.

按照惯例,shell中的环境变量全部使用大写字母表示。命令替换:反引号和圆括号是等价的;

`shell_command`==$(shell_command)

变量赋值语法:variable_name=value;variable_name表示变量名;value表示将要赋值给变量的值;中间的等号“=”称为赋值符号,赋值符号的左右两边不能直接跟空格,否则shell会将其视为命令;正确的赋值语句:

# v1=Linux# v2='RedHet Linux'# v3="Redhat Linux $HOSTTYPE"# v4=12345.

清除变量:

unset variable_name

3. 条件测试

条件测试的语法有两种:test和[;test expression;[ expression ];expression与左右方括号之间也必须都保留一个空格。在测试运算符“=”、“!=”、“-z”等符号的左右两边,一定含有一个空格。整数测试语法:

test number1 op number2或者[ number1 op number2 ]

op表示运算符;运算符:-eq (等于);-ne(不等于);-gt(大于);-lt(小于);-ge(大于等于);-le(小于等于);[ 12 -gt 14 ]–>echo $? 1。文件测试语法:

test op file或者[ op file ]

-a file文件是否存在;-b file 文件是否存在且为块文件;-c file 文件是否存在且为字符文件;-d file 文件是否存在且为目录;-e file同-a一样;-s file 文件的长度是否大于0或者文件为非空文件;-f file 文件存在且为常规文件;-w file 文件是否存在且可写;-x file 文件是否存在且可执行;-r file 文件是否存在且可读;-u file 文件是否设置suid位;-l file 文件是否存在且为符号链接。逻辑操作符:字符串测试、整数测试、以及文件都是提供了一个测试条件,而在shell编程中,经常遇到同时判断多个条件的情况,逻辑操作符可以把多个不同的条件组合起来,从而构成一个复杂的条件表达式;

! expression 逻辑非expression -a expression2 逻辑与expression1 o expression2 逻辑或

“:”冒号是一个特殊的命令,指空命令,该命令不做任何事情,但是它的退出状态永远是0,如果我们将改命令作为if语句中的条件,则会永远执行then子句。条件判断语句:if

if expressionthen   statement1   statement2   ...fi或者if expression;then    statement1    statement2fi

if else

#!/bin/bashecho "please enter a score" #输入提示信息read score #读取用户输入数据#如果用户没有输入数字,提示用户重新输入if [ -z "$score" ];then  #-z是否为空串   echo "You enter nothing.Please enter a score:"   read scoreelse #如果用户输入的数据不对,则重新输入    if [ "$score" -lt 0 -o "$score" -gt 100 ]; then      echo "The score should be between 0 and 100.Please enter   again:"      read score    else #输出A        if [ "$score" -ge 90 ]; then           echo "The grade is A."        else#输出B            if [ "$score" -ge 80 ]; then                echo "The grade is B."            else#输出C                 if [ "$score" -ge 70 ]; then                      echo "The grade is C."                 else#输出D                      if [ "$score" -ge 60 ]; then                          echo "The grade is D."                      else#输出E                           echo "The grade is E."                       fi                  fi             fi         fi     fifi

if elif

#!/bin/bashecho "please enter a score" #输入提示信息read score #读取用户输入数据#如果用户没有输入数字,提示用户重新输入if [ -z "$score" ];then  #-z是否为空串   echo "You enter nothing.Please enter a score:"   read scoreelse #如果用户输入的数据不对,则重新输入    if [ "$score" -lt 0 -o "$score" -gt 100 ]; then      echo "The score should be between 0 and 100.Please enter   again:"      read score    else #输出A        if [ "$score" -ge 90 ]; then           echo "The grade is A."#输出B        elif [ "$score" -ge 80 ]; then            echo "The grade is B."#输出C        elif [ "$score" -ge 70 ]; then            echo "The grade is C."#输出D        elif [ "$score" -ge 60 ]; then            echo "The grade is D."        else#输出E            echo "The grade is E."         fi     fifi

case

case variable invalue1)    statement1    statement2    ...    statementn;;value2)     statement1     statement2     ...     statementn;;...valuen)     statement1     statement2     ...     statementn;;*)     statement1     statement2     ...     statementn;;esac

在上面的语法中,variable是一个变量,case语句会将该变量的值与value1~valuen中的每个值进行比较,如果与某个value的值相等,则执行该value所对应的一组语句。当遇到“;;”符号的时候,就跳出case语句,执行esac语句后面的语句,如果没有任何一个值与variable的值相匹配,则执行*后面的一组语句。

注:对于上面的case语句,用户应该注意以下几点:

i 对于变量名variable,可以使用双引号,也可以不使用;

ii 每个case子句中的条件测试部分,都以右括号“)”结束;

iii 每个case子句都以一对分号“;;”作为结束符,在脚本执行的过程中,当遇到一对分号时,会跳过当前case子句后面的所有的case子句,包括*所对应的子句,执行esac子句后面的其他语句。

iv case语句结构以esac结尾。

4. 计算运算表达式

expr expression 计算某个表达式的值 使用expr时,需要对运算符号进行转移,\* \( \) .

#!/bin/bashresult=`expr 2 - 100`echo "$result"result=`expr 2 \* 100`echo "$result"result=`expr \( 2 - 6 \) \* 2`echo "$result"

使用$(( )) 来进行算术运算,无需对运算符和括号做转移处理。

#!/bin/bashresult=$((3+6))echo "$result"result=$((3*6))echo "$result"

使用$[…] 与$(())用法相同使用let命令可以执行一个或者多个算术表达式,其中的变量名无需使用$符号,如果表达式中含有空格或其他特殊字符,则必须将其引用起来。

#!/bin/bashn=10let n=n+1echo "$n"let n=n*10echo "$n"

5. 位运算符

运算符说明举例<<左移4<<2,将4左移2位,结果为16>>右移8>>2,将8右移2位,结果为2&按位与8&&4,将8和4进行按位与运算,结果为0|按位或8|4,将8和4进行按位或运算,结果为12~按位非~8,将8进行按位非运算,结果为-9^按位异或10^6,将10和6进行按二进制位异或运算,结果为12

左移位是将整个数字的所有二进制位左移相应的数量,每移一位,相当于将当前的数字乘以2;右移与左移相对;&是将两个数的二进制位进行与运算,都为1才为1,有一个为0,则为0;|或运算与&相对,二进制位全为0才为0;非运算是将原来二进制位的1和0调换;异或是全为1或全为0,结果就是1,否则为0。

6. 自增自减运算符

运算符说明++variable先将变量variabe的值加1,然后再赋给variable–variable先将变量variabe的值减1,然后再赋给variablevariable++先使用variable的值,然后再将该变量的值加1variable–先使用variable的值,然后再将该变量的值减1

7. 数字常量的进制

默认情况下,shell总以十进制来表示数字;在shell中用户可以使用两种语法来表示不同的进制,一:增加前缀,以o开头表示八进制,以ox开头表示十六进制; 二:使用#,例如2#100表示二进制,8#42表示八进制。

#!/bin/bash#十进制((x=20))echo "$x"20#八进制((x=o20))echo "$x"16#二进制((x=2#100))echo "$x"4#八进制((x=8#123))echo "$x"83

8. for循环结构

8.1 带列表的for循环语句

for variable in {list}do   statement1   statement2   ...done

variable为循环变量,list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开。do和done之间的所有语句称为循环体。

for var in 1 2 3 4 5 6 7 8do   echo "the number is $ var"done等价for var in {1..8}do   echo "the number is $var"done

for语句的默认步长是1,如果想设定步长,基本语法:

for varibale in {start..end..step}do   statement1   statement2   ..done

start表示起始的数值,end表示终止的数值,step表示步长。

类似C风格的for循环语句:

for ((i=1;i<5;i++))do    echo "$i"done

9. until 循环语句

与for相反,条件为0时不执行循环体,条件为1时执行循环体,并且是先判断条件结果再执行循环体:

until expressiondo     statement1   statement2   ..done#!/bin/bashi=1until [ "$i" -eq 21 ]do   useradd uaer$i   echo "password" | passwd --stdin user$i > /dev/null   let "i++"done

useradd是一个shell命令,用来向系统中添加新用户,passwd也是一个shell命令,用来设置用户密码的。

10. while循环语句

与until语句相反,条件为0时执行while循环语句,非0,执行done后面的语句:

while expressiondo   statement1   statement2   ..done

与for循环相比,while循环条件的变化通常在循环体内部,例如某个循环变量的自增或者结束标记的赋值等。而for循环的条件变化通常在for语句中括号的第3个部分,until语句的条件变化也通常放在循环体内部。

更新中。。。。。

无论何时何地,只要创造就有收获,只有不息的奋进,才能证明生命的存在。

shell学习笔记

相关文章:

你感兴趣的文章:

标签云: