shell-grammar

来源:互联网 发布:大数据与经济发展 编辑:程序博客网 时间:2024/06/12 21:53

  • Shell运行环境
  • 变量
    • shell变量局部变量环境变量
    • 整数
    • 字符串
      • 各种操作
    • 数组
      • 各种操作
  • 参数
  • 分支控制
    • 死循环
  • 函数
  • 运算符
    • test测试
  • 输入输出
    • 输入出重定向

此章节内容大部分请参考

Shell运行环境

登录到linux就有个登录shell

可以在此登录shell中执行语句,也可以执行shell脚本(开个子shell执行shell语句);

与环境有关系的指令:
- export var 在任何子shell中均有该变量的拷贝

子shell继承了父shell, 但子shell不能影响父shell的变量值;

  • source var 当前shell 中执行命令;

变量

var=value #变量定义不能有空格; 变量的二次赋值不能用$var,直接用变量名则可。unset var #变量的删除#变量的使用()$var${var} #增加变量名边界的定位

shell变量、局部变量、环境变量

局部变量:当前shell实例可用的变量;
环境变量:所有的程序,包含shell启动的程序都能访问的变量;
Shell变量:前面两种的总称!

/etc/bashrc vs /etc/profile中的环境变量关系?

整数

暂无

字符串

字符串形式:
- 单引号:

不能包含变量; 原样输出;

  • 双引号:
    可以包含变量;可以有转义字符;可以包含单引号;

各种操作

  • 拼接:把字符串/变量连在一起就行了(不需要任何符号)
  • 长度:${#strval}
  • 截串:${string:1:4}
  • 查找子串:expr index "$string" u

数组

只支持一维数组
Array=(1 2 3 4),值之间的隔离用 空格或者换行。

各种操作:

  • 单个元素获取:${array[0]}
  • 获取全部元素:arrayname[@]{array_name[*]}
  • 数组的长度:{#array_name[@]} 或者{#array_name[*]}
  • 单个元素的长度:lengthn=${#array_name[n]}

参数

参数名 意义 $# 传递到脚本的参数个数 $* $@ $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 $0 Shell脚本名 $1 … 第1个参数,。。

@

# function showDollarVar(){    echo '-------------$*'     for arg in $*    do        echo $arg    done    echo '-------------"$*"'    for arg in "$*"    do        echo $arg    done    echo '-------------$@'    for arg in $@    do        echo $arg    done    echo '-------------"$@"'    for arg in "$@"    do        echo $arg    done}showDollarVar "hua jiang hu" zhiroot@shellLang# ./grammar.sh -------------$* #以一个单字符串的形式显示所有向脚本传递的参数。huajianghuzhi-------------"$*" #全部参数视为一个整体hua jiang hu zhi-------------$@ #同于没有加“”的$*huajianghuzhi-------------"$@" #原始参数一个个解析出来(默认为空格)hua jiang huzhi

分支控制

要将分支控制的助词如then, do提前一句,那么需要在前一句话后加分号;再加此助词。

if []; then     .. fi  for [] ; do    ..done

if

if [ $a -eq $b ]then    echo $a "==" $belif [ $a -gt $b ]; then    echo $a ">" $belse    echo $a "<" $bfi

for

#for ((i=0; i<5; i++))#for (( i=0; i<5; i++ ))for i in 0 1 2 3 4 #只能空格为间隔,加,则会解释成数据do    echo 'hello', $idone

while

#while(($a<=3)) ##cant use -lewhile [ $a -le 3 ]do    echo $a    let "a++"done

死循环

while(true)  while [ true/1/false ]  for ((;;))

函数

形式如下

# 不带任何参数# /bin/sh不能带function关键字,/bin/bash则可有可无function[ function ] funname [()]{    action;    # 如果不加,将以最后一条命令运行结果,作为返回值。    [return int;] #return后跟数值n(0-255)}

运算符

  • 算术运算符
    +、-、*、/、%、=、==、!=
    原生的bash不支持,得借助(let,expr,..)之类的表达式计算工具。
let a=a+1`expr $a + $b`  #注意:表达式与运行符号之间必须要空格。# 注意:乘号*需要转义。
  • 字符串运算符
    =判等、!=
    -z长度是否为0、-n长度是否不为0
    str是否不为空(这点如下)。
    if [ $string ]; then         echo ‘string not empty’    fi
  • 布尔运算符

    !非、-o或、-a与

  • 逻辑运算符

    &&逻辑与、||逻辑或

test测试

  • 数值测试:
    • -eq等于则为真、-ne
    • -gt大于, -lt
    • -ge大于等于、-le
  • 字符串测试:
    • =, !=,
    • -z –n
  • 文件测试:

    • -e文件存在
    • -f文件存在且为普通文件
    • -r, -w, -x, -s, -d, -c, -b

    文件测试运算符:[ -r $file ]
    -r file 检测文件是否可读,如果是,则返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。
    -d file 检测文件是否是目录,如果是,则返回 true。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
    -b file 检测文件是否是块设备文件,如果是,则返回 true。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
    -p file 检测文件是否是有名管道,如果是,则返回 true。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。

输入、输出

Echo

Echo –e “…\x” 开启转义Echo –e “…\c” 不换行

printf 比echo更强大,移植性更好;

printf  format-string  [arguments...]

0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。

输入出重定向

n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

$ command > /dev/null 2>&1

原创粉丝点击