bash + argをLinuxマシンのディスクの1つと比較する方法

bash + argをLinuxマシンのディスクの1つと比較する方法

次のコマンドを使用して、Linuxシステムのディスクデバイスをキャプチャできます。

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

私のBashスクリプトでは、次の行を使用して、スクリプトのパラメータが自分のコンピュータのディスクの1つと一致するかどうかをテストします。

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がnullの場合、次の例外が発生します。

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

$argそれでは、私のLinuxシステムにこれらのディスクの1つが含まれていることを確認する正しい方法は何ですか?

ベストアンサー1

コマンドのほとんどはコンポーネントを使用していないようです。必要なものは次のとおりです。

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 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

おすすめ記事