阅读过前两篇shell的入门知识,你已经可以编写自己的shell脚本了。今天我们来接着介绍linux中其他bash命令

假如我们想将数据传递到shell,我们就需要获取命令行参数,来与我们的shell交互。

一、读取命令行参数:

shell为您提供了一些读操作,可以使用变量来处理输入参数:

  • $0: 脚本名字
  • $1: 第 1 个参数
  • $2: 第 2 个参数

我们来编写脚本demo.sh

#!/bin/bash
echo $0 
echo $1
echo $2
echo $3

执行脚本,查看结果:

sh demo.sh 9 99 999
demo.sh
9
99
999

我们计算两个参数的和:

#!/bin/bash
total=$(( $1 + $2 ))
echo 第一个参数: $1

echo 第二个参数: $2

echo Total: $total

运行,查看结果:

sh demo.sh 9 99
第一个参数: 9
第二个参数: 99
Total: 108

命令行参数不仅可以数字,还可以是字符串。

$#可以读取命令行参数的个数:

#!/bin/bash
echo 参数个数为: $# 

sh demo.sh 1 2 3 4
参数个数为:4

$*将所有参数作为一个值

$@将所有参数作为单独的值保存,因此可以对它们进行迭代

我们来看一个例子:

#!/bin/bash

total=1

for var in "$*"; do

    echo "\$* =======> #$total = $var"
    total=$(($total + 1))

done

total=1

for var in "$@"; do

    echo "\$@ =======> #$total = $var"
    total=$(($total + 1))

done

我们执行查看结果如下:

sh demo.sh 2 3 4
$* =======> #1 = 2 3 4
$@ =======> #1 = 2
$@ =======> #2 = 3
$@ =======> #3 = 4

我们看到 $*将所有参数作为一个值输出,而$#可以遍历出所有的参数。

对于参数前面带有 -的选项,依然可以通过上述形式获取。

二、shift 的使用

我们可以使用shift命令实现参数迭代,我们看一个例子:

#!/bin/bash

total=1

while [ -n "$1" ]; do # 循环
    echo "#$total = $1"
    total=$(($total + 1))
    shift
done

我们执行 sh demo.sh 1 2 3 4,结果如下:

#1 = 1
#2 = 2
#3 = 3
#4 = 4

三、我们将普通参数与 -选项分开获取

看例子:

#!/bin/bash

while [ -n "$1" ]; do # while loop starts

    case "$1" in

    -a) echo "-a 选项" ;; # Message for -a option
    -b) echo "-b 选项" ;; # Message for -b option
    -c) echo "-c 选项" ;; # Message for -c option
    --)
        shift # The double dash which separates options from parameters

        break
        ;; # Exit the loop using break command
    *) echo "$1 不能匹配" ;;
    esac

    shift

done

total=1

for param in $@; do
    echo "#$total: $param"
    total=$(($total + 1))
done

我们执行sh demo.sh -a -b -- 2 3,结果如下:

-a 选项
-b 选项
#1: 2
#2: 3

我们看到我们经常需要指定一个分隔符--,用来区分选项参数

四、一些常用标准选项参数

  • -a :列出所有选项
  • -f :指定文件
  • -c:获取项目计数
  • -d:输出目录
  • -o:将输出发送到文件中

参考:

Linux Bash Scripting

往期:

shell 的入门学习笔记第一篇

shell中函数使用教程第四篇

shell中流程控制语法的第二篇


Leave Your Comment

电子邮件地址不会被公开。 必填项已用*标注