Bash
bash + 如何將 arg 與 linux 機器中的磁碟之一進行比較
我可以使用以下命令擷取我的 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