Bash

bash + 如何將 arg 與 linux 機器中的磁碟之一進行比較

  • May 11, 2022

我可以使用以下命令擷取我的 Linux 機器的磁碟設備:

lsblk -lnb | numfmt --to=iec --field=4 | grep disk | awk '{print $1}'
sda
sdb
sdc
sdd

在我的 bash 腳本中,我使用下面的行來測試腳本的參數是否與我機器上的一個磁碟匹配:

if [[ ` lsblk -lnb | numfmt --to=iec --field=4 | grep disk | awk '{print $1}' | grep -c $arg ` != 0 ]] 
then
echo “argument is a disk”
.
.
.

fi

我將腳本執行為

bash /tmp/verify_disks  <some arg>

但萬一$arg錯誤為arg=”—help”,或萬一$arg為空,我得到以下異常:

Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

那麼,檢查$arg我的 Linux 機器中是否包含其中一個磁碟的正確方法是什麼?

您似乎沒有使用該命令的大部分組件。所有你需要的是:

lsblk -lnb | awk '$NF=="disk"{print $1}'

然後,為了避免在沒有給出參數時出現錯誤消息,您需要引用它以便grep給出一些要搜尋的內容,即使該內容是空字元串:

if [[ "$(lsblk -lnb | awk '$NF=="disk"{print $1}' | grep -c "$arg")" != 0 ]]; then
   echo "argument is a disk"
fi

但是,當您什麼都不給它時,這將返回“argument is a disk”,因為任何內容(包括空行)都與空字元串匹配:

$ echo foo | grep -c ""
1
$ echo "" | grep -c ""
1

避免這個問題的一個簡單方法——也是一個很好的習慣,你應該經常檢查你的​​論點是否合理——是首先檢查你的論點:

#!/bin/bash

if [[ -z "$1" ]]; then
 echo "The script needs at least one non-empty argument"
 exit 1
fi


arg="$1"

if [[ "$(lsblk -lnb | awk '$NF=="disk"{print $1}' | grep -c "$arg")" != 0 ]]; then
 echo "argument is a disk"
else
 echo "not a disk!"
fi

引用自:https://unix.stackexchange.com/questions/701944