私はほぼ常にルートなので、最近権限722でbash実行可能ファイルを作成しました。ファイルの内容は次のとおりです。
#!/home/nolan/Documents/test/listFiles
[ $# -lt 1 ] && dirFocus = "" || dirFocus = $1
dirSize=$(ls -a $dirFocus | wc -w)
for ((a = 1; a <= $dirSize; a++)) ; do
i = 1
for ITEM in $(ls -a $dirFocus); do
declare -i i
declare -i a
if [ $a -eq $i ]; then
echo "$a : $ITEM"
fi
i = $[ $i + 1 ]
done
done
端末で実行する場合は、次のようにします。
root @ /home/nolan/Documents/test: bash listFiles
1 : .
2 : ..
3 : apple
4 : dirCheck
5 : ifTest
6 : ifTest.txt
7 : listFiles
8 : myscript
9 : nolan.txt
10 : pointer_to_apple
11 : scriptx.sh
12 : Stuff
13 : weekend
14 : weekend2
15 : weekend3
予想通り、このような結果が出ました。しかし、2番目は次のとおりです。
root @ /home/nolan/Documents/test: ./listFiles
bash: ./listFiles: /home/nolan/Documents/test/listFiles: bad interpreter: Too
many levels of symbolic links
私が得るエラーです。正確に何が間違っていますか?別のフォーラムをチェックしてみましたが、私の状況に合わないようです。
答え1
スクリプトの最初の行は「shebang」行です。スクリプトを解釈するために、実行するプログラムをカーネル(プログラムローダー)に通知します。スクリプトはスクリプトを解釈するために独自の実行を試み、スクリプトは再びインタプリタを解釈するために自分自身を呼び出します。
run scriptを使用するとカーネルはbash filename
呼び出されませんが、bashは有効なスクリプトを実行するために使用されます。
置く
#! /bin/bash
最初の行に行くと、すべてがうまくいくでしょう。
ところで、システムを実験するための制限された権限を持つユーザーを作成してください。なぜならroot
修理できないのは何でも簡単に破壊できるからです。
答え2
チョロバは説明がとても良かった。問題は、シェルスクリプトがbash
。
以下はスクリプトの再実装に関する提案です。
構文エラーが含まれていません(
dirFocus = ""
たとえば、=
割り当てにスペースが含まれていない構文エラー)。スペースと改行文字を含むファイル名を処理します。出力を繰り返すと、
ls
ファイル名が不適切になり、wc -w
ファイル名にスペースが含まれている場合は誤った数がカウントされます。最新のシェル構文(
$[ $i + 1 ]
未使用のbash
構文)を使用してください。紹介する非常に小さい出力の改善(
(dir)
ディレクトリ名に追加)
#!/bin/bash
shopt -s dotglob # make wildcards match hidden names by default
shopt -s nullglob # make wildcards expand to nothing if no match
count=0
for name in "${1:-.}"/*; do
count=$(( count + 1 ))
if [ -d "$name" ]; then
printf '%d : %s (dir)\n' "$count" "${name##*/}"
else
printf '%d : %s\n' "$count" "${name##*/}"
fi
done
また、ファイルのリストは何度も拡張されませんが、コードはls
ディレクトリの各名前に対してディレクトリ全体を拡張します。
${1:-.}
「空または設定されていない場合はその中にある内容を使用してください。$1
この場合は使用してください.
」を意味します。
${name##*/}
「の文字列$name
ですが、最後の数字ではありません/
」を意味します。