shell脚本基础语法

     shell脚本语法学习:
     1、变量命名规则:
     /**
     *变量名由数字、字母、下划线组成;
     *必须以字母或者下划线开头;
     *不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)
     *如 param[合格]   12param[报错]
     */
     
     2、获取变量时最好用${变量名} 
     /**
     * 如:param="123"  变量赋值时,变量名不能与等号空格隔开
     * echo $param   或者  echo ${param}变量获取值时,变量名不能与等号空格隔开
     * variable=`commond` 或者    variable=$(commond)  将命令赋值
     * readonly param  自动变量,不能重新赋值     
     * unset param  删除变量 
     * 变量类型可分为局部、环境、shell变量
     */
     
     3、特殊变量列表、变量、含义 
     /**
     *$0 当前脚本的文件名 
     *$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数 
     *$# 传递给脚本或函数的参数个数。 
     *$* 传递给脚本或函数的所有参数。 
     *$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时——换行,与 $* 稍有不同——不换行 
     *$? 上个命令的退出状态,或函数的返回值。 
     *$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 
     *如  ./test.sh  param1 param2       test.sh的内容为echo "This is First param:$1"          
     *打印  This is First param:param1
     */
     
     4、转义字符和含义  
     /**
     *\\ 反斜杠 
     *\a 警报,响铃 
     *\b 退格(删除键) 
     *\f 换页(FF),将当前位置移到下页开头 
     *\n 换行 
     *\r 回车 
     *\t 水平制表符(tab键)  
     *\v 垂直制表符 
     *如 echo -e "hello\nworld" 若去掉[-e]则无法换行
      *注:echo 命令的[-E]禁止转义,默认也是不转义;[-n]可以禁止插入换行符。
     */
     
     5、awk、expr[常用]支持表达式计算命令
     /**
     *如 echo `expr 2 + 2` 或者 echo $(2 + 2) 表达式运算中变量和运算符需空格隔开
     *
     *关系运算符只支持数字,不支持字符串,除非字符串的值是数字。    
     *注:运算符和C语言一样
     *
     *布尔运算符
     *! 非运算,表达式为 true 则返回 false,否则返回 true。 
     *-o 或运算,有一个表达式为 true 则返回 true。
     *a 与运算,两个表达式都为 true 才返回 true。
     *如  if [ $a -lt 20 -o $b -gt 40 ]   若then与if在同一行则需加';' 
     *    then                            如if [ $a -lt 20 -o $b -gt 40 ];then  
     *        echo "hello"      
     *     fi
     */
     
     6、字符串运算
     /**= 检测两个字符串是否相等,相等返回 true。
     *!= 检测两个字符串是否相等,不相等返回 true。
     *-z 检测字符串长度是否为0,为0返回 true。 
     *-n 检测字符串长度是否为0,不为0返回 true。 
     *str 检测字符串是否为空,不为空返回 true。 
     *如:if [ "abc" = "abc" ]    若then与if在同一行则需加';' 
     *    then                    如if [ "abc" = "abc" ];then  
     *     echo "abc and abc are equal"
     *    fi 
     */
     
     7、文件检测
     /**
     *-b file 检测文件是否是块设备文件,如果是,则返回 true。 
     *-c file 检测文件是否是字符设备文件,如果是,则返回 true。
     *-d file 检测文件是否是目录,如果是,则返回 true。 
     *-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。  
     *-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
     *-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 
     *-p file 检测文件是否是具名管道,如果是,则返回 true。
     *-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
     *-r file 检测文件是否可读,如果是,则返回 true。 
     *-w file 检测文件是否可写,如果是,则返回 true。
     *-x file 检测文件是否可执行,如果是,则返回 true。
     *-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
     *-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 
     *如 file="/etc/passwd" 
     *   if [ -r $file ]     若then与if在同一行则需加';' 
     *   then                如if [ -r $file ];then  
     *        echo "File has read access"      
     *   fi
     */
     
     8、字符串获取方式
     /**
     *如 str="ad"
     *echo ${#str}  获取字符的长度
     *echo ${str:1:2}  提取字符子串
     *echo "hello "$str"!" 拼接字符串
     *echo $(index "$str" d)  查找子字符串
     */
     
     9、数组获取方式
     /**
     *语法格式如下:${array_name[index]}
     *如 array_name=(1 2 3)
     *echo ${array_name[0]}  获取第一个元素值
     *echo ${array_name[*]} 或 echo ${array_name[@]}  获取所有元素值
     *echo ${#array_name[*]} 或 echo ${#array_name[@]} 获取元素的长度
     *或 echo ${#array_name[n]} 获取单个元素的长度
     *注:数组获取形式以及下标和C语言一样
     */
     
     10、printf函数的用法
     /**
     *语法格式如下:printf  format-string[获取格式]  arguments...[参数列表]
     *printf 命令不用加括号
     *format-string 可以没有引号,但最好加上,单引号双引号均可。
     *参数多于格式控制符(%)时,无对应的控制符%参数则会重用format-string
     *arguments 使用空格分隔,不用逗号。
     *如 printf "%d %s\n" 5 "abc"
     *   printf "This is %s" abc def       输出This is abcThis is def
     */
     
     11、if else分支用法
     /**      
     *语法格式如下:
     *if [ expression ] then ... fi
     *if [ expression ] then ... else ... fi
     *if [ expression ] then ... elif [ expression ] then ... else ... fi
     *如  if [ '123' = '123' ]    若then与if在同一行则需加';' 
     *    then                    如if [ '123' = '123' ];then  
     *       echo '123 and 123 are equal'
     *    fi
     *或
     *   if test '123' = '123' ; then 可以用test命令替代中括号     
     *注:expression 和中括号([ ])之间必须有空格,否则会有语法错误。
     */
     
     12、for循环用法
     /**
     *语法格式1如下:
     *for param[变量取值] in list[参数列表——数值|字符串|文件路径]
     *do
     * command
     * ...
     *done
     *如
     *for FILE in $HOME/.bash*   Linux自带的变量[set或env命令可查看所有变量]
     *do
     *  echo $FILE
     *done
     *语法格式2如下:
     *for ((i=1;i<n;i++))
     *do
     * echo ${i}
     *done
     */
     
     13、while循环用法
     /**
     *语法格式如下:
     *while [ expression ]
     *do
     * command
     * ...
     *done
     *如
     *while [ 3 -lt 5 ]  可以用test命令替代中括号
     *do
     *  echo "Yes"       进入到死循环
     *done
     */     
     
     14、until循环用法
     /**
     *语法格式如下:
     *until [ expression ]    正好与if、while相反,判断为真时退出循环
     *do
     * command
     * ...
     *done
     *如
     *until [ 3 -lt 5 ]  可以用test命令替代中括号
     *do
     *  echo "Yes"      
     *done
     */     
     
     15、test命令用法
     /**
     *test 命令用于检查数值、字符和文件条件是否成立
     *数值测试:
     *-eq 等于则为真 
     *-ne 不等于则为真 
     *-gt 大于则为真 
     *-ge 大于等于则为真 
     *-lt 小于则为真 
     *-le 小于等于则为真 
     *如 if test 1 -lt 5      结果为真
     *
     *字符串测试
     *= 等于则为真 
     *!= 不相等则为真 
     *-z 字符串 字符串长度伪则为真 
     *-n 字符串 字符串长度不伪则为真 
     *如 if test "a" = "a"    结果为真
     *
      *文件测试
     *-e 文件名 如果文件存在则为真 
     *-r 文件名 如果文件存在且可读则为真 
     *-w 文件名 如果文件存在且可写则为真 
     *-x 文件名 如果文件存在且可执行则为真 
     *-s 文件名 如果文件存在且至少有一个字符则为真 
     *-d 文件名 如果文件存在且为目录则为真 
     *-f 文件名 如果文件存在且为普通文件则为真 
     *-c 文件名 如果文件存在且为字符型特殊文件则为真 
     *-b 文件名 如果文件存在且为块特殊文件则为真 
     *如 if test -r "/etc/passwd"  结果为真
     */
     
     16、break和continue的用法
     /**
     *break命令允许跳出所有循环(终止执行后面的所有循环)。
     *若break后面有参数n则表示跳出第几层循环
     *如  for var1 in 1 2 3
     *    do
     *     echo "test exist${var}"
     *    for var2 in 0 5
     *    do
     *    if test ${var1} -eq 2 -a  ${var2} -eq 0
     *    then
     *        break 1
     *    else
     *           echo "${var1} ${var2}"
     *    fi
     *   done
     *  done
     *
     *continue命令跳出当前循环
     *若continue后面有参数n则表示跳出第几层循环
     */
     
     17、函数用法
     /**
     *语法格式如下:
     *[function] function_name () {
     *          ......
     *       [ return int; ]   返回值的范围[0,255]之间
     *   }
     *如  output(){
     *     return "1"   
     *     }
     *    output
     *    echo "$?"        $?返回上个退出命令或调用函数的返回值 
     *注:调用函数可以在后面添加参数
     *如  output(){
     *      echo "the param is $num"
     *      return "1"   
     *     }
     *    read num         #输入字符 
     *    output $num      #后面附带参数
     *    echo "$?"        $?返回上个退出命令或调用函数的返回值 
     *$unset .f function_name 删除函数名
     *
     *调用另一个脚本的函数——文件包含
     *方法一:   . ./subscript.sh        其中./表示当前目录      
     *方法二:   source ./subscript.sh
     *注:1、两个点之间,用空格隔开
     *   2、两个脚本不在同一目录,要用绝对路径
     *如  . ./test.sh 或 source ./test.sh
     *    echo `output 2`
     */
     
     18、输入输出重定向
     /**
     *语法格式如下:
     *command > file 将输出重定向到 file。 
     *command < file 将输入重定向到 file。 
     *command >> file 将输出以追加的方式重定向到 file。 
     *n > file 将文件描述符为 n 的文件重定向到 file。 
     *n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 
     *n >& m 将输出文件 m 和 n 合并。 
     *n <& m 将输入文件 m 和 n 合并。 
     *<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 
     *如
     *  echo 'this is output content to file' > test.sh
     *test.sh文件内容就替换成this is output content to file
     *
     *注:文件描述符0通常是标准输入(STDIN)1是标准输出(STDOUT) 2是标准错误输出(STDERR)
     */dev/null 文件可以理解为黑洞即垃圾回收站
     *如 
     *command > /dev/null 2>&1    屏蔽stdout和stderr——禁止输出
     */
     

     19、vi编辑命令 
     /**
     *h         将光标向左移动                                $    移动到当前行末尾    
     *j、+、Enter     将光标向下移动                    :n   移动到行n
     *k、-     将光标向上移动                                x    删除光标当前位置的字符
     *l           将光标向右移动                               dd  删除光标所在的整行文本
     *}           将光标移动到当前段落的末尾          d$ 删除当前光标位置到该行结束的所以文本
     *{           将光标移动到当前段落的开头          dw 从当前光标位置向前删除单词
     *)         将光标移动到当前句子的末尾          J    将下一行文本内容合并到本行行尾
     *(           将光标移动到当前句子的开头          a    在当前光标位置后附加内容
     *^          移动到当前行的第一个非空字符      A   在当前光标所在行的后面附加内容
     */


     参照链接:
     http://c.biancheng.net/cpp/shell/

     注:这是整理过后的笔记,接下来的其它语法后面会加以补充

猜你喜欢

转载自my.oschina.net/u/3378039/blog/1602396