ここに書くのは今回が初めてなので、間違った点があればどんなフィードバックでも歓迎します!私はシェルスクリプトに初めてアクセスし、アイテムがリストにあるかどうかを確認する関数を作成しようとしています。この例では、指定されたパラメータがシステムの既存のユーザーに対応していることを確認します。項目が空白で囲まれていることを確認して間違った肯定を避けたいのですが、これは明らかにリストの最初の項目と最後の項目を除外します。リストの始めと終わりにスペースを追加できると思いましたが、どうすればいいかわかりません。どんなヒントやアドバイスでも大歓迎です!これまで私のコードはこの投稿。次のようになります。
-->既存のユーザーのリストです。
users=$(getent passwd {1000..60000} | awk -F ':' '{print $1}')
-->指定されたコマンドライン引数が既存のユーザーに存在することを確認する関数
contains(){
[[ $1 =~ (^|[[:space:]])"$2"($|[[:space:]]) ]] && return 0 || return 1
}
ここで、$ 1はgetent(上記を参照)を使用してpasswdファイルから取得したユーザーのリスト、$ 2は検証する指定された(コマンドライン)パラメータです。
メッセージの内容は次のとおりです。テスト目的でlist(1 2 3 4)インクルード機能を使用しようとしました。 2 と 3 について確認すると、メソッドは機能しますが、1 と 4 では機能しません。
答え1
以下のカスタム機能をお試しください。各項目が別々の行にあるリストを許可します。使用法を参照してください。
contains(){ printf "%s\n" "$1"|grep '^'"$2"'$' > /dev/null; }
戻りコードは grep コマンドのコードです。
- 0 - 項目がリストにある場合(すべての行と一致、大文字と小文字の区別)
- 1 - アイテムがリストにない場合
- 2以上 - エラーが発生した場合(エラーメッセージが表示されます)
必要な方法で動作させるには、上記の関数を変更する必要があるかもしれません。
- 何も印刷せず、可能なエラーメッセージも印刷しません。
&> /dev/null
- すべて印刷する(リストにそのエントリがある場合はエラーメッセージが表示されることがあります):削除
> /dev/null
- 可能なエラーメッセージを印刷せず、アイテムがリストにある場合にのみ印刷します。
2> /dev/null
- 関数が0または1のみを返すように強制します。
&& return 0 || return 1;
使用法:
list="$(getent passwd {1000..60000}|cut -f1 -d:)"
item="USER_NAME_HERE"
#or
list="$(printf "%s\n" {1..4})"
item="1"
#then
contains "$list" "$item"
#to see the return code
echo $?
答え2
users="$(getent passwd | awk -F: '{print $1}')"
contains(){
grep -qFx "$2" <<< "$1"
}
次のようにテストしてみてください。
if contains "$users" "jim"; then
echo jim is a user
else
echo jim is not a user
fi