Shell脚本

原创声明:作者:陈咬金、 博客地址:https://www.cnblogs.com/zh94/

 

原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/e1007d5a-4ec0-4ee7-98a0-e82989f0bffb

 

    
mkdir
touch newFile 或 vim newFile
chmod 755 newFile
rm -rf newFile
 
sudo sh -c
 
find / -name kb-core
 
which bash
bash特殊字符上
;    可以在同一行上写两个或者两个以上的命令
;;    双分号可以用于终止case选项
'    '单引号',直接认为变量只是一个字符,将会阻止STRING中所有特殊字符的解释
"    "双引号",变量引用时,还是显示变量的值,将会阻止(解释)STRING中大部分特殊的字符
/    斜线/,表示路径符,/bin/bash,多个/或者//,////bin/////bash 表示的含义于单斜线含义相同,
\    反 斜线,表示转义符号,\n ,\',\",   
`    反序号,反序号的命令会被优先执行;cp `mkdir back` test.sh back,表示先创建back文件夹再将test.sh拷贝到back目录下;
:    冒号,一个什么都不做的命令,等价于shell中的true,
while :
do
    echo "endless loop"
done
                       可以在if/then中做占位符
condition=5
if [ $condition -gt 0 ]
then :   # 什么都不做,退出分支
else
    echo "$condition"
fi
                        变量扩展
$ : > test.sh   # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
bash特殊字符下
小括号 () :在小括号中的变量将会按照一个子shell运行,且可以定义初始化数组
#! /bin/bash
#作为子shell运行,
 
a=123
( a=321; )
echo "$a" #a的值为123而不是321,因为括号将判断为局部变量
 
#定义为数组
 
array=(1 2 3);
echo ${array[2]} #输出 3
中括号 [] :1. 条件表达式放置到中括号中,第二,如上,直接数组取值也是使用的[]中括号
a=5
if [ $a -lt 10 ]
then
    echo "a: $a"
else
    echo 'a>10'
fi
大括号 {} :1.匿名代码块,2.文件名扩展
a=123
{ a=321; }
echo "a = $a" #输出结果为321,匿名代码块中所声明的变量,对于脚本的其他部分是可见的,于子shell小括号()的使用方式不同,需注意;
 
touch t.txt
cp t.{txt,back}   #复制t.txt的内容复制到t.back文件中,等同于 cp t.txt t.back ,直接cp拷贝的方式,会将当前文件的权限,也会拷贝到新的文件中,如果是使用cat t.txt >> t.back,则只是将t.txt中的内容拷贝到一个新的文件t.back中,并不具备执行等权限;需重新使用chmod赋值部分权限即可;
变量和参数
变量定义:
    变量定义时=等号双边不能存在空格,如:name="test",命名规则参考Java即可;
 
变量的使用:
    变量的使用可以使用 $name的方式进行引用,或${name},帮助识别变量的边界,如${name}123,如不加花括号,则解释器会把 name123当做一个变量名称来引用;
 
只读变量:name="test" ; reaonly name  则表示当前name变量为只读变量,后续不会被更改,否则异常提示;
 
位置参数:
 
./test.sh 参数1 参数2 参数3 通过这种方式传参,则在对应的脚本中通过 $1,$2 的方式来获取对应的脚本启动时的参数启动值;如下说明:
 
从命令行传递到脚本的参数:$0,$1,$2,$3...
 
$0就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数,然后是第四个。$9 之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}。
 
$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个
$$ : 脚本运行的当前进程 ID号
$! : 后台运行的最后一个进程的进程 ID号
$@ : 与$*相同,但是使用时加引号,并在引号中返回每个参数
$: 显示shell使用的当前选项,与 set命令功能相同
$? : 显示最后命令的退出状态。 0表示没有错误,其他任何值表明有错误。
基本运算符
算数运算符:(使用 expr 作为计算工具)
    注意事项:
        1. 表达式和运算符之间要有空格,如:sum=`expr $a + $b`
        2. 使用乘法计算时,需使用 \ 转义:如:sum=`expr $a \* $b`
        3. 使用条件表达式的时候:[$a == $b],其中条件表达式和算数运算一样,都需要中间有空格存在,而赋值运算符,a=2,则不能存在空格符号;
关系运算符:(只支持数字,不支持字符串,除非字符串也是数字)
  
-eq        检测两个数是否相等,相等则返回true
-ne        检测两个数是否相等,不相等返回true
-gt        左边数是否大于右边,大于则返回true
-lt        左边数是否小于右边,小于则返回true
-ge        左边数是否大于等于右边,大于等于则返回true
-le        左边数是否小于等于右边,小于等于则返回true
 
    if[$a -eq $b]
    then 
        echo 'a等于b'
    else
        echo 'a不等于b'
    fi
逻辑运算符:(&& ,||  )
if [[$a -eq 100 && $b -eq 100 ]]
then
    echo 'true'
else
    echo 'false'
fi
字符串运算符:(只适合字符串比对时使用)
=          检测两个字符串是否相等,相等返回true
!=         检测两个字符串是否相等,不相等则返回true
-z         检测字符串长度是否为0,为0则返回true
-n         检测是否为0,不为0则返回true
str        检测字符串是否为空,不为空则返回true
 
    a='abc'; b='efg';
    #判断两个字符串是否相等
    if[$a = $b]
    then
        echo '两字符串相等'
    else
        echo '两字符串不同'
    fi
    #判断字符串长度是否为0
    if[-n $a]
    then
        echo '$a字符串长度不等于0'
    else
        echo '$a长度为0'
    fi
    #判断字符串是否为空,默认为 str 运算符
    if[$a]
    then
        echo '字符串不为空'
    else
        echo '字符串为空'
    fi
文件测试运算符:()
 
-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。
流程控制
if else(语法注意事项:if空格[空格$a -eq $b空格)需注意空格部分,条件表达式的变量比对前后,都需要增加空格,否则语法错误异常)
$a=2;$b=3
#直接if else 的写法
if [ $a -eq $b ]
then
    echo 'a==b'
else
    echo 'a!=b'
fi
#if else if 的写法
if [ $a -eq $b ]
then
    echo 'a==b'
elif  [ $a -gt $b ]
then
    echo 'a>b'
else
    echo 'a!=b'
fi
# if 嵌套if 的写法
if [ $a -eq $b ]
then
    if [ $a -eq $b ]
        then
            echo '双重if判断a==b'
    fi
fi
# 使用test 用来表示条件表达式,如上述的判断语句直接将对应的 [ ] 中括号部分代替为test即可
if test $a -eq $b 
then
    echo 'a==b'
fi
for 循环格式(于java程序中的for循环不同,此处只是循环结构数据,没有变量++的操作,如果使用(())则可以达到类似于c语言中的for效果)
#in关键词后面跟所要循环的变量,var表示所循环的变量所对应的关键词(注:实际上只要为空格分离的数据皆为可循环的数组)
for var in 1 2 3 4
do
    echo "DATA:$var"    #输出结果为 1 2 3 4
done
#也可以直接使用数组进行循环
nums=(10 20 30)                 #需注意的是,此处创建数组时,数组中的内容为空格分离,而并非逗号分隔,逗号分隔则为一个整体,并非数组结构
for var in ${nums[*]}            #此处循环数组结构时,使用nums[*]表示得到当前数组中的所有数据内容,否则则默认获取第一条数据,即10;详情可查看shell                                    #中关于数组的介绍;而之所以使用${nums[*]},而并非 $nums[*],是因为需要使用{}大括号来表示变量整体,帮助识别变量边                                               #界,上述变量中有所介绍 end;                    
do
    echo $var                        #输出结果为 10  20 30
done
#当然也可以直接获取当前shell启动时所获取的参数进行循环,如下:
./test.sh 100 200
for var in $*
do
    echo $var                     #输出结果为100 200
done
while 语句(while可以用于不间断的执行一系列命令,如下:)
while ;                # 此处 ; 表示空命令,类似于此处的true
do
    echo '不断输出'    #则将会不间断输出该内容,
done
#通过循环的方式不断的接受所输入的参数,并判断如果为quit时,则退出当前程序;
while read data     #read data 表示读取键盘所输入的值,此处通过循环执行,则输入一次结果则判断一次,直到符合规定为止(此处为举例,应用场景有很多)
do
    if [ $data = 'quit' ]
    then
        echo '退出成功'    
        exit 0
    fi
done
#判断变量是否满足条件,并循环++
var=1
while(( $var<=5 ))    #关于(())双括号的结构语句:https://www.cnblogs.com/linuxprobe/p/5634208.html
do
    echo $var
    let "var++"       #let 是和expr 相同的四则运算符号,https://www.cnblogs.com/zwgblog/p/6005822.html
done
case 语句()
read data                                    #读取对应的输入值
case $data in
1) echo "$data 所对应的值为1" ;;              #判断当前输入值是否为1,每一个模式后必须以 )有括号结束;
2) echo "$data 所对应的值为2" ;;              # ;; 表示执行当前模式后,则结束以下递推再执行的操作,类似于其他程序中case所对应的break;
3|4|5) echo "$data 所对应的值为3-5之间" ;;    # 表示当前的输入值在 3|4|5任何一项时则满足当前case,进入当前模式执行
*) echo "$data 值为其它";;                   # 当所对应的值为其它时,*表示获取所有数值,再执行对应的命令;
esac                                        # 结尾使用 case的反向英文,esac表示case语句的结尾;
break 和 continue (停止跳出循环 和 跳出当前循环)
var=1
while (( $var<=5 ))
do
        let "var++"
        if test $var -eq 3
            then
            echo 'stop ++'          
            continue                    #此处continue则表示跳出当前循环,continue后的代码将不会被执行,输出结果为:2,stop++,4,5,6
                                              #此处更改为break则直接停止当前循环,输出结果为 2,stop++
        fi
        echo $var
done
函数结构
函数定义(1. 所有函数在使用前必须先定义,也就是先定义,再使用;2. 函数返回值在“函数调用后”通过 $? 来获取数据,3.return 数值必须为数字(0-255之间))
demoFun(){
    echo "$1 + $2"        # $1表示获取当前传参的一个数值,方法参数的获取方法于脚本中传参的获取方式相同;                                                     #获取超过第10个参数时需要使用${10}使用{}取变量值的分界线
    return 23             #表示调用方法后的返回值,也可以不使用return,
}
demoFun 30 50             #表示调用demoFun方法,并传参30 和 50
echo $?                   #函数返回值在调用该函数后,使用 $? 来获取,此处输出函数调用后的返回值,输出结果为 23;
 
  双括号结构语句((  ))
双括号语句,作用还是很重要****的****https://www.cnblogs.com/linuxprobe/p/5634208.html
 
 
 
 

 

posted @ 2019-11-24 16:04  陈咬金  阅读(452)  评论(0编辑  收藏  举报