linux shell 学习笔记

    xiaoxiao2022-06-30  92

    shell中定义变量形式: yourname='tengxi' 注意等号两边不能有空格,否则会报语法错误 使用变量 echo $yourname 或者 echo ${yourname}(推荐带花括号的写法) 变量可以被重新赋值 只有使用变量时候需要借助$和{}

    将变量变成只读变量 url='www.baidu.com' readonly url url='www.cnlive.com' 这样会报错

    删除变量 不能删除只读变量 unset yourname

    shell中的变量类型   局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。   环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。   shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    shell中的字符串 单引号中不可以有变量,不可以有单个的单引号,转义后的也不行,可成对出现,拼接字符串用 双引号中可以有变量,可以有转义字符

    输出字符串长度 echo ${#string}

    截取字符串,从第一个开始截取四个字符,会自动去除前后空格,但是空格会体现在字符串长度中 echo ${string:1:4}

    获取指定内容在字符串中的位置 echo `expr index "$string" io` (指定内容是i或者o,返回第一次出现的位置,从1开始,若字符串中不存在指定内容,返回0)

    shell中的数组(只支持一维数组,初始化数组时不需要指定数组大小,数组下标从0开始,数组用小括号()表示,数组中每一项中间用空格分隔) 定义数组 array=(value1 value2 value3)  获取数组中的某一项 echo ${array[1]} 获取数组中的所有项 echo ${array[@]} 或者 echo ${array[*]} 获取数组长度 echo ${#array[@]} @或者*表示获取数组的长度,具体值表示获取数组中某一项的长度,指定项下标超出数组长度的时候,返回0

    shell中注释代码 :<<EOF     这里是要被注释的内容 EOF (EOF 可以换成其他符号) # 这里是要被注释的内容 还可以用一对花括号括起来,测试未成功

    向脚本传递参数 (参数传多了传少了都不会报错,就按顺序找,找不到拉倒) $0 (获取执行的shell脚本文件名) $1 (获取传递给脚本的第一个参数) $#    传递到脚本的参数个数 $*    以一个单字符串显示所有向脚本传递的参数。 如"$*"用「」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $$    脚本运行的当前进程ID号 $!    后台运行的最后一个进程的ID号 $@    与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $-    显示Shell使用的当前选项,与set命令功能相同。 $?    显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。

    @与*的区别 相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

    shell 表达式 算数运算符 通过expr来实现 注意 * 乘法 *前边有转义的斜杠,不写报错哦!  表达式两边一定要有空格哦!不然按照普通字符串打印哦 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 \ 

    关系运算符(只支持数字) -eq    检测两个数是否相等,相等返回 true,[ $a -eq $b ] 返回 false -ne    检测两个数是否不相等,不相等返回 true,[ $a -ne $b ] 返回 true -gt    检测左边的数是否大于右边的,如果是,则返回 true,[ $a -gt $b ] 返回 false -lt    检测左边的数是否小于右边的,如果是,则返回 true,[ $a -lt $b ] 返回 true -ge    检测左边的数是否大于等于右边的,如果是,则返回 true,[ $a -ge $b ] 返回 false -le    检测左边的数是否小于等于右边的,如果是,则返回 true,[ $a -le $b ] 返回 true

    布尔运算符 !    非运算,表达式为 true 则返回 false,否则返回 true。    [ ! false ] 返回 true -o    或运算,有一个表达式为 true 则返回 true,[ $a -lt 20 -o $b -gt 100 ] 返回 true -a    与运算,两个表达式都为 true 才返回 true,[ $a -lt 20 -a $b -gt 100 ] 返回 false

    逻辑运算符 &&    逻辑的 AND    [[ $a -lt 100 && $b -gt 100 ]] 返回 false ||    逻辑的 OR    [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    字符串运算符 =    检测两个字符串是否相等,相等返回 true,[ $a = $b ] 返回 false !=    检测两个字符串是否相等,不相等返回 true,    [ $a != $b ] 返回 true -z    检测字符串长度是否为0,为0返回 true,[ -z $a ] 返回 false -n    检测字符串长度是否为0,不为0返回 true,[ -n "$a" ] 返回 true $    检测字符串是否为空,不为空返回 true,[ $a ] 返回 true

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

    echo输出命令 会自动添加换行符 echo -e 开启转义 (\n 换行 \c 不换行) echo > myfile 显示结果定向至文件(文件不存在时会新建文件,文件存在时会覆盖原有内容) 原样输出字符串,不进行转义或取变量(用单引号) 显示命令执行结果 echo `date` 

    用户输入命令 一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。 read sth 读取用户输入的内容保存为变量sth  -p 输入提示文字  -n 输入字符长度限制(达到6位,自动结束)  -t 输入限时  -s 隐藏输入内容

    test 检查条件是否成立,它可以进行数值、字符和文件三个方面的测试 数值测试 可在[]中进行数字运算 result=$[5+8](不能有空格哦) 这里的乘法不需要转义 -eq    等于则为真 -ne    不等于则为真 -gt    大于则为真 -ge    大于等于则为真 -lt    小于则为真 -le    小于等于则为真

    字符串测试(字符串中间有空格的时候会报错,检测的数值太多) =    等于则为真 !=    不相等则为真 -z 字符串    字符串的长度为零则为真 -n 字符串    字符串的长度不为零则为真

    文件测试 -e 文件名    如果文件存在则为真 -r 文件名    如果文件存在且可读则为真 -w 文件名    如果文件存在且可写则为真 -x 文件名    如果文件存在且可执行则为真 -s 文件名    如果文件存在且至少有一个字符则为真 -d 文件名    如果文件存在且为目录则为真 -f 文件名    如果文件存在且为普通文件则为真 -c 文件名    如果文件存在且为字符型特殊文件则为真 -b 文件名    如果文件存在且为块特殊文件则为真

    流程控制 sh中的流程不可以为空!!!!!

    条件语句 if 条件 then      do something else      do something else fi

    if 条件 then     do something elif     do something else else      so some other thing fi

    循环语句 for var in item1 item2 ... itemN do     command1     command2     ...     commandN done

    多选择语句(类似于js中的switch case) case 值 in 模式1)     command1     command2     ...     commandN     ;; 模式2)     command1     command2     ...     commandN     ;; *)     command1     command2     ...     commandN     ;; esac

    死循环 while : do     command done

    while true do     command done

    for (( ; ; ))

    shell函数 function functionName() {     do something }(其中function可以省略) 带返回值的函数 return $((需要被返回的参数)) 执行函数: functionName 即可 获取函数中的返回值 $? 函数参数用$n表示,当n >= 10 时 需要${n}  其他的$n即可  第一个参数是$1 即下标从0开始 $#    传递到脚本的参数个数 $*    以一个单字符串显示所有向脚本传递的参数 $$    脚本运行的当前进程ID号 $!    后台运行的最后一个进程的ID号 $@    与$*相同,但是使用时加引号,并在引号中返回每个参数。 $-    显示Shell使用的当前选项,与set命令功能相同。 $?    显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。

    shell文件包含(模块化) 被包含的文件不需要被赋予执行权限 . ./test1.sh 或者 source ./test1.sh  


    最新回复(0)