Linux基础部分的学习(4)- shell语法学习2

本文详细介绍了Bash脚本中的关键元素,包括printf命令的使用,如格式化输出;test命令及逻辑运算符,用于文件类型和权限的判断;if...then、if...else...fi、if...elif...else...fi和case...esac的条件语句;以及for、while、until循环结构。此外,还涉及了函数、exit命令、文件重定向和外部脚本的调用,是学习Bash脚本的全面教程。
摘要由CSDN通过智能技术生成


前言

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼


一、printf命令

printf命令用于格式化输出,类似于C/C++中的printf函数。

printf "%10d.\n" 123  # 占10位,右对齐
printf "%-10.2f.\n" 123.123321  # 占10位,保留2位小数,左对齐
printf "My name is %s\n" "yxc"  # 格式化输出字符串
printf "%d * %d = %d\n"  2 3 `expr 2 \* 3` # 表达式的值作为参数

在这里插入图片描述

二、test命令与判断符号[]

1.逻辑运算符&&和||

  • && 表示与,|| 表示或
  • 二者具有短路原则: expr1 && expr2:当expr1为假时,直接忽略expr2 expr1 ||expr2:当expr1为真时,直接忽略expr2
  • 表达式的exit code为0,表示真;为非零,表示假。(与C/C++中的定义相反)

2.test命令

test命令用于判断文件类型,以及对变量做比较。

test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。


acs@9e0ebfcd82d7:~$ ls  # 列出当前目录下的所有文件
homework  output.txt  test.sh  tmp
acs@9e0ebfcd82d7:~$ test -e test.sh && echo "exist" || echo "Not exist"
exist  # test.sh 文件存在
acs@9e0ebfcd82d7:~$ test -e test2.sh && echo "exist" || echo "Not exist"
Not exist  # testh2.sh 文件不存在

代码如下(示例):

test 2 -lt 3  # 为真,返回值为0
echo $?  # 输出上个命令的返回值,输出0

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.文件类型判断

命令格式:
test -e filename  # 判断文件是否存在

在这里插入图片描述

4.文件权限判断

test -r filename  # 判断文件是否可读

在这里插入图片描述

5.整数间的比较

test $a -eq $b  # a是否等于b

在这里插入图片描述

6.字符串比较

在这里插入图片描述

7.多重条件判定

test -r filename -a -x filename

在这里插入图片描述

8.判断符号[]

[]与test用法几乎一模一样,更常用于if语句中。另外[[]]是[]的加强版,支持的特性更多。

[ 2 -lt 3 ]  # 为真,返回值为0
echo $?  # 输出上个命令的返回值,输出0

注意
	[]内的每一项都要用空格隔开
	中括号内的变量,最好用双引号括起来
	中括号内的常数,最好用单或双引号括起来

三、判断语句

if…then形式
类似于C/C++中的if-else语句。

单层if

if condition
then
   语句1
   语句2
  ...
fi

示例:
在这里插入图片描述
在这里插入图片描述

单层if-else

if condition
then
   语句1
    语句2
   ...
else
    语句1
    语句2
   ...
fi

示例:
在这里插入图片描述
在这里插入图片描述

多层if-elif-elif-else

if condition
then
    语句1
    语句2
    ...
elif condition
then
    语句1
    语句2
    ...
elif condition
then
    语句1
    语句2
else
    语句1
    语句2
    ...
fi

示例
在这里插入图片描述
在这里插入图片描述

case…esac形式

case $变量名称 in
值1)
    语句1
    语句2
    ...
    ;;  # 类似于C/C++中的break
值2)
    语句1
    语句2
    ...
    ;;
*)  # 类似于C/C++中的default
    语句1
    语句2
    ...
    ;;
esac

示例
在这里插入图片描述
在这里插入图片描述

四、循环语句

1.命令格式1:

for var in val1 val2 val3
do
    语句1
    语句2
    ...
done

示例
在这里插入图片描述

在这里插入图片描述

示例二
输出当前路径下的所有文件名,每个文件名一行:

for file in `ls`
do
    echo $file
done

在这里插入图片描述

示例三(输出1-10,10个数)

for i in $(seq 1 10)
do
    echo $i
done

在这里插入图片描述

示例四(使用{1…10} 或者 {a…z})

for i in {a..n}
do
    echo $i
done

在这里插入图片描述

2.,命令格式2

for ((expressi**加粗样式**on; condition; expression))
do
    语句1
    语句2
done

示例
在这里插入图片描述
在这里插入图片描述

3.while…do…done循环

while condition
do
    语句1
    语句2
    ...
done

示例

4.until…do…done循环

当条件为真时结束。
until condition
do
    语句1
    语句2
    ...
done

在这里插入图片描述
在这里插入图片描述

5.break命令

跳出当前一层循环,注意与C/C++不同的是:break不能跳出case语句。
while read name
do
    for ((i=1;i<=10;i++))
    do
        case $i in
            8)
                break
                ;;
            *)
                echo $i
                ;;
        esac
    done
done

在这里插入图片描述

6.continue命令

for ((i=1;i<=10;i++))
do
    if [ `expr $i % 2` -eq 0 ]
    then
        continue
    fi
    echo $i
done

在这里插入图片描述

五、函数

bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。

如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。

函数的return值可以通过$?来获取。
[function] func_name() {  # function关键字可以省略
    语句1
    语句2
    ...
}
func() {
    name=yxc
    echo "Hello $name"
}

func
func() {
    name=yxc
    echo "Hello $name"

    return 123
}

output=$(func)
ret=$?

echo "output = $output"
echo "return = $ret"

六-exit命令

exit命令用来退出当前shell进程,并返回一个退出状态;使用$?可以接收这个退出状态。

exit命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。

exit退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
#! /bin/bash

if [ $# -ne 1 ]  # 如果传入参数个数等于1,则正常退出;否则非正常退出。
then
    echo "arguments not valid"
    exit 1
else
    echo "arguments valid"
    exit 0
fi

七–文件重定向

每个进程默认打开3个文件描述符:

  • stdin标准输入,从命令行读取数据,文件描述符为0
  • stdout标准输出,向命令行输出数据,文件描述符为1
  • stderr标准错误输出,向命令行输出数据,文件描述符为2

可以用文件重定向将这三个文件重定向到其他文件中

命令	说明
command > file	将stdout重定向到file中
command < file	将stdin重定向到file中
command >> file	将stdout以追加方式重定向到file中
command n> file	将文件描述符n重定向到file中
command n>> file	将文件描述符n以追加方式重定向到file中

示例

echo -e "Hello \c" > output.txt  # 将stdout重定向到output.txt中
echo "World" >> output.txt  # 将字符串追加到output.txt中
read str < output.txt  # 从output.txt中读取字符串
echo $str  # 输出结果:Hello World``

八 --引入外部脚本

语法格式

. filename  # 注意点和文件名之间有一个空格source filename
示例
创建test1.sh,内容为:

#! /bin/bash

name=yxc  # 定义变量name
然后创建test2.sh,内容为:

#! /bin/bash

source test1.sh # 或 . test1.sh

echo My name is: $name  # 可以使用test1.sh中的变量
执行命令:

acs@9e0ebfcd82d7:~$ chmod +x test2.sh 
acs@9e0ebfcd82d7:~$ ./test2.sh 
My name is: yxc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值