美文网首页
shell语言

shell语言

作者: 二进制人类 | 来源:发表于2022-09-24 20:53 被阅读0次

第一个脚本程序

  1. shell脚本文件使用.sh作为文件后缀;
  2. 在脚本文件中的第1行使用#!指明shell解释器;
  3. 对于脚本文件的注释,使用#单行注释;
  4. 在运行脚本文件之前,需要使用chmod +x 脚本文件名称,来给脚本文件添加可执行权限,然后才能够运行。
#! /bin/bash              # 指定shell解释器/bin/sh /bin/dash /bin/bash /bin/rbash
echo "hello shell"        # shell语句块

shell语言

变量

自定义变量

1.基本使用语法

语法格式:

变量名称=变量初始值

变量的访问使用$访问

#! /bin/bash            #指定shell解释器
num="hello shell"      # 定义变量num,并设置初始值为"hello shell"     
echo $num              # 访问变量的值

2.特殊使用

a.键盘输入

语法格式

read 变量名

#! /bin/bash            #指定shell解释器
read value               # read value 从键盘读取数据存储到变量value中
echo $value              # 访问变量的值

b.引号问题

#! /bin/bash            #指定shell解释器

num="hello shell"      # 将整个字符串的内容赋值给变量num
echo $num
num=hello123           # 将字符串hello123赋值给变量num
echo $num
num='hello shell'      # 将整个字符串的内容赋值给变量num 
echo $num

c.只读变量

在定义变量的时候,使用readonly修饰。该变量只能在第一次定义的时候设置初始值,后序过程中只能访问,不能在次修改。

d.对于变量如果使用export修饰,则导出为环境变量,在其它的shell脚本中可以访问。引用环境变量

环境变量

所谓的环境变量,指的是系统能够正常运行所需要使用的环境信息参数,通过变量实现存储,则称为环境变量。

常用的环境变量:

HOME 用于保存注册目录的完全路径名,用户家(主)目录。

PATH 可执行程序的路径

LD_LIBRARY_PATH 依赖库路径。

常用的环境命令:

env 输出所有环境变量的信息;

export 设置环境变量的值;

unset 清除环境变量

环境变量的访问:和自定义变量一样,$环境变量名称

预设变量

运行命令:./test.sh aaa bbb ccc ddd eee fff hhh 888 999 0000 1212121

#! /bin/bash

echo $#    # 统计脚本运行时候,所传递参数的个数11.
echo $*    # 所有参数内容
# 后面表示依次得到对应序号的参数内容,注意如果序号大于9则需要使用{}包含     
echo $1    # 得到序号1的参数内容 aaa
echo $2    # bbb
echo $3    # ccc
echo $4    # ddd
echo $5    # eee  
echo $6    # fff
echo $7    # hhh
echo $8    # 888
echo $9    # 999
echo ${10}    # 得到序号10的参数内容 0000
echo ${11}    # 得到序号11的参数内容 1212121
echo $?        # 得到上一条指令运行的状态
echo $$        # 当前进程号 可以使用ps命令查看
echo $0        # 当前进程名称

变量的特殊使用

1.双引号

直接解析变量为内容本身

#! /bin/bash            #指定shell解释器

name=阿斯巴甜
echo "你的名字是$name" #你的名字是阿斯巴甜

2.单引号''

直接解析变量为字符串

#! /bin/bash            #指定shell解释器

name=阿斯巴甜
echo '你的名字是$name' #你的名字是$name

3.反撇号`(注意在数字1的左侧按键)

一般会嵌套到双引号中,此时反撇号中的内容为系统命令

#! /bin/bash            #指定shell解释器

echo "当前时间为`date +%F`"         #当前时间为2022-09-24

4.-e 转义字符

对于转义字符需要使用-e来说明,否则直接解释为字符串

#! /bin/bash            #指定shell解释器

echo "I want play a \n game with you"         #I want play a \n game with you


echo -e "I want play a \n game with you"      << EOF
                                      I want play a 
                                       game with you
EOF
                              

5.圆括号的使用

#! /bin/bash            #指定shell解释器

name=阿斯巴甜
( name=巴斯光年; echo $name )    # 此时圆括号内容,局部范围内修改变量name的值,当()结束还原为括号开始的初始值
echo $name                      # 输出的是阿斯巴甜

6.花括号的使用{}

#! /bin/bash            #指定shell解释器

name=阿斯巴甜
{ name=巴斯光年; echo $name; }    # 此时name访问会修改name的值,即使{}结束,其值不会在还原。{}开始和结束需要使用空格
echo $name                       # 输出的是巴斯光年

语句

测试语句

测速语句也称为条件测速语句,主要用文件类型测试、字符串测试、数字测试、复合测试语句

测试语句的两种语法格式:

  1. test condition
  2. [ condition ] 注意:在方括号做测试语句的时候,条件的两边需要使用空格。

文件测试语句

测试文件状态的条件表达式

 -e #是否存在
 -d #是目录
 -f #是文件
 -r #可读 -w 可写 -x 可执行
 -L #符号连接 
 -c #是否字符设备
 -b #是否块设备
 -s #文件非空
#! /bin/bash 
file=test.sh
test -f $file        # 测试变量file的内容是否为文件
echo $?              # 得到上一条指令运行的状态

[ -f $file ]         # 测试变量file的内容是否为文件 
echo $?              # 得到上一条指令运行的状态

字符串测试语句

测试字符串的条件:

>、<、==、!=

-n 测试是否为非空串

-z 测试是否为空串

#! /bin/bash            #指定shell解释器

str1="阿斯巴甜"
str2="巴斯光年"

test str1 > str2         #测试str1是否大于str2
echo $?

test str1 != str2        #测试str1是否不等于str2
echo $?

[ str1 == str2 ]         #测试str1是否等于str2
echo $?

[ -n str1 ]              #测试str1是否为非空串
echo $?                                     

[ -z str2 ]
echo $?                  #测试str2是否为空串

数字测试语句

对于数字测试语句可以使用test 条件表达式,也可使用[ 条件表达式 ],在条件表达式中可以使用如下运算符实现

英文单词 shell比较符
相等 equal -eq
不相等 not equal -ne
大于 greater than -gt
大于等于 greater equal -ge
小于等于 less equal -le
小于 less than -lt
#! /bin/bash

num1=12
num2=23

test $num1 -eq $num2        #测试num1的值是否等于num2
echo $?

[ $num1 -eq $num2 ]        #测试num1的值是否等于num2
echo $?

test $num1 -lt $num2       #测试num1的值是否小于num2
echo $?

复合测试语句

-a (and)两状况同时成立 test -r file -a -x file file同时具有r于x权限
-o (or)两状况任何一个成立 test -r file -o -x file file 具有r或x权限
! 相反状态 test ! -x file 当file不具有x时
#! /bin/bash
num1=9527
test $num1 -lt 30 -a $num1 -gt 10    #测试num1的值是否小于30,并且大于10
echo $?

控制语句

if条件语句

if控制语句

if [ 条件表达式 ];then # 条件表达式也可以使用 test 语句来实现

执行语句块

else

执行语句块

fi # 以fi作为结束标志

1.条件执行实行

#! /bin/bash
if test 1 -eq 1 ; then            # 条件判断执行,then起始执行
        echo "1 等于 1"
fi

2.条件分支执行实例

#! /bin/bash
if test 1 -eq 2; then    # 条件表达式,成立执行then后面的语句,否则不成立执行else后面的语句
  echo "1 等于 2"
else
  echo "1 不等于 2"
fi

3.条件嵌套

#! /bin/bash
if test 1 -eq 2; then
else
 # 条件判断语句的嵌套
 if [ 2 -eq 3 ]; then
    echo "2 等于 3"
 else
    echo "2 不等于 3"
 fi
fi

嵌套的优化处理

#! /bin/bash
file = test.sh
if test -d $file; then
        echo $file is dir
elif [ -f $file ]; then             # 实现嵌套的优化,等价于 else if (条件)
        echo $file is file
elif [ -b $file ]; then
        echo $file is blockdiv
else 
        echo $file is other
fi

case条件控制语句

#! /bin/bash
case $1 in
 "1")
 echo 1
 ;;       # 以;;结束,并且每一个条件都需要使用;;结束
 "2"
 echo 2
 ;;
 *)
 echo other
 ;;
 esac

for控制语句

c语言形式

#! /bin/bash
sum=0
for (( i=0; i <= 100; i++ )) do # 循环的括号是双层,
   sum=`expr $sum + $i`  # expr 实现算术运算,将$sum转化为整数和$i转换的整数相加;
   done
   echo $sum

for in形式

#! /bin/bash
for value in 1 2 3 4 5 6 7 8 9 10 
do  # 注意对于do必须单独起行,否则会当作初始化表中的数据访问
 echo $value 
 done

while控制语句

#! /bin/bash
i=0
sum=0
while [ $i -lt 100 ] # 条件成立进入while循环体执行,否则退出整个循环
do                   # do需要单独写出,不能直接放在条件语句后面
sum=`expr $sum + $i`
i=`expr $i + 1`
done
echo $sum

until控制语句

#! /bin/bash
i=0
sum=0
until [ $i -gt 100 ]  # 条件不成立成立进入until循环体执行,否则条件成立退出整个循环
do
   sum=`expr $sum + $i`
done
echo $sum

break continue控制语句

break continue控制语句

break break命令允许跳出循环。 break 通常在进行一些处理后退出循环或case 语句

continue 命令类似于break 命令 只有一点重要差别,它不会跳出循环,只是跳过这个循环步

#! /bin/bash
i=0
sum=0

until [ $i -gt 100 ]
do
        if [ $i -eq 50 ]; then        
                i=`expr $i + 1`
                break                # break跳出整个循环体
        fi  

        if [ $i -eq 5 ]; then
                i=`expr $i + 1`
                continue            # continue 结束本次循环进入下一次循环
        fi  

        sum=`expr $sum + $i`
        i=`expr $i + 1`
done

函数

#! /bin/bash
# 函数定义的方式一
myTest(){
echo "func test"
}

# 方式二
function myFunc(){
  echo "function test"
}

# 参数可以使用预设变量传递参数
file_or_dir(){
echo $1          #使用预设变量接收传递的参数
if [ -f $1 ]; then
echo $1 is file
return 1
elif [ -d $1 ]; then
echo $1 is dir
return 2
fi 
return 0          #函数中可以有返回值
}

read myfile
ls $myfile
 
myTest
myFunc

file_or_dir $myfile  #函数调用并传递参数
err=$?               #接收函数的返回值

if [ $err -eq 1 ]; then
cat $myfile
elif [ $err -eq 2]; then
ls $myfile
fi

相关文章

网友评论

      本文标题:shell语言

      本文链接:https://www.haomeiwen.com/subject/ufeaortx.html