私のコードに問題があります。Bourne shell
コマンドを使用してサーバーからユーザーのリストをインポートし、ファイルに保存するwho
スクリプトを作成しています。その後、名前を確認し、スクリプトがread line
重複した名前を見つけた場合は、そうでない場合はユーザー名とともに警告メッセージを表示します。重複していないアイテムが印刷されます。スクリプトが重複した名前を見つけるとすべてがうまく機能しますが、スクリプトが重複した名前を見つけられない場合は何も印刷しません。私は最後のドアに関連していることを知っていますが、多くのif
解決策を試しましたが、それでも生活に閉じ込められています。誰でも提案があれば助けてください。事前にお答えいただきありがとうございます。 (下記コード参照)
#!/bin/sh
#who -u | sort -k1,5 > test3
log=~/Desktop/test3
while [ -f test ]; do
while IFS= read line; do
user=( $line )
if [ "$olduser" = "${user[0]}" ]; then
printf '\nThe user %s duplicated' "$olduser"
fi
olduser="${user[0]}"
done<"$log"
if [[ "$olduser" != "${user[0]}" ]]; then
printf '\nNo duplication found.\n';
fi
#Testing store value
#printf '\nolduser value = %s\n' "$olduser"
printf '\n=================================================================\n'
sleep 3
done
答え1
sh
あなたのコードは、標準がサポートしていない2つ以上を使用します。
[[ ... ]]
はPOSIX構文の拡張であり、bash
例えば、独自の条件式を導入するために使用されます。user=( $line )
、別のPOSIX拡張である配列を作成しますsh
。
テキストファイルで重複した行を見つけるには:
sort file | uniq -d
sort
入力ファイルがソートされ、uniq -d
連続して複数回出現する行のみが出力されます。
これを出力に使用who
し、ユーザー列(最初の列)にのみ注意を払うには、次のようにします。
who | awk '{ print $1 }' | sort | uniq -d
スクリプトで使用してください。
who | awk '{ print $1 }' | sort | uniq -d >duplicates.txt
if [ -s duplicates.txt ]; then
echo 'The following dupes were found:'
cat duplicates.txt
else
echo 'No dupes'
fi
この-s
テストは空でないファイルに適しています。
シェルでこれを手動で実行するには、重複した項目が見つかったときにフラグを設定します。
dupe=0
who | awk '{ print $1 }' | sort -o users.txt
while IFS= read -r user; do
if [ -n "$prev_user" ] && [ "$user" = "$prev_user" ]; then
printf 'Duplication for "%s"\n' "$user"
dupe=1
fi
prev_user=$user
done <users.txt
if [ "$dupe" -ne 1 ]; then
echo 'No dupes'
fi