次のコマンドを使用して、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