Bourne Shell Scripting - ループ構文はシンプルです
質問
私はプログラミングにまったく初心者ではありませんが、正確に経験豊富ではありません。練習用の小さなシェルスクリプトを書きたいです。
これが私がこれまでに持っているものです:
#!/bin/sh
name=$0
links=$3
owner=$4
if [ $# -ne 1 ]
then
echo "Usage: $0 <directory>"
exit 1
fi
if [ ! -e $1 ]
then
echo "$1 not found"
exit 1
elif [ -d $1 ]
then
echo "Name\t\tLinks\t\tOwner\t\tDate"
echo "$name\t$links\t$owner\t$date"
exit 0
fi
基本的に私がやろうとしているのは、指定されたディレクトリ内のすべてのファイルをスクリプトに通過させ、それが持っているリンクの量、所有者、および作成された日付を使用して各ファイルの名前を表示することです。作成日または少なくともファイルの最後の変更の日付を表示するための構文は何ですか?
別のことは、forループを作成するための構文は何ですか?私が理解していることから、私は1ドルで1ドル(1ドルが正しいディレクトリ内のすべてのファイルである1ドル)を書く必要があるでしょう。それから、各ファイルのチェックと各ファイルの情報を表示する必要があります。 forループを開始して終了するには(これの構文は何ですか?)。
ご覧のとおり、私はあまり馴染みのあるボーンシェルプログラミングではありません。役立つウェブサイトがある場合、またはこれにアプローチするより良い方法がある場合は、私に見せてください!
解決
ループの構文:
for var in list
do
echo $var
done
例えば:
for var in *
do
echo $var
done
しかし、あなたが考えたいと思うかもしれないのは、次のようなものです:
ls -l | while read perms links owner group size date1 date2 time filename
do
echo $filename
done
の出力を分割します ls -l
オンザフライでフィールドに入るので、自分で分割する必要はありません。
フィールドスプリッティは、デフォルトではスペース、タブ、Newlineが含まれているシェル変数IFSによって制御されます。これをシェルスクリプトで変更する場合は、変更してください。したがって、IFSの値を変更することにより、たとえば、これをコンマに設定することにより、CSVファイルを解析できます。この例は、CSVから3つのフィールドを読み取り、2番目と3番目のみを吐き出します(事実上、シェルに相当します cut -d, -f2,3 inputfile.csv
)
oldifs=$IFS
IFS=","
while read field1 field2 field3
do
echo $field2 $field3
done < inputfile.csv
IFS=oldifs
(注:あなたはしません 必要 IFSを元に戻すために、私は通常、スクリプト内のさらにテキスト処理が影響を受けた後に影響を受けないことを確認するために行います。
両方にたくさんのドキュメントがあります for
と while
ループ; Googleのためだけに:-)
他のヒント
あなたは見たいかもしれません 高度なバッシュスクリプトガイド. 。ループを説明するセクションがあります。
使用することをお勧めします find
オプション付き -printf "%P\t%n\t%u\t%t"
$1
最初の位置パラメーターです $3
3番目です $4
4番目です。スクリプトは開始されたディレクトリ(またはそのファイル)とは何の関係もありません。たとえば、これを使用してスクリプトを開始した場合:
./script.sh apple banana cherry date elderberry
次に、変数 $1
「リンゴ」などに等しいでしょう。特別なパラメーター $#
この場合は5つになります。
スクリプトの名前はに含まれています $0
と $*
と $@
引用符に表示されるかどうかに応じて、異なる動作をするすべての位置パラメーターを含む配列です。
サブストリングスタイルのインデックスを使用して、位置パラメーターを参照できます。
${@:2:1}
上記の例を使用して「バナナ」を与えるでしょう。と:
${@: -1}
また
${@:$#}
最後の(「エルダーベリー」)を与えます。このコンテキストでは、マイナスサインの前のスペースが必要であることに注意してください。
for x in "$@"; do
echo "$x"
done
「$@」は、提供されたファイル名で任意の空白を保護します。明らかに、「echo $ x」の代わりにあなたの本当の仕事をしてください。しかし、$@は、スクリプトにコマンドラインに提供されるすべてのジャンクです。
しかし、$#が1に等しくない場合、スクリプトは救済しますが、最大4つの引数を完全に期待しているようです(したがって、スクリプトの初期の部分で4ドルを参照してください)。
システムでGNUを見つけていると仮定します
find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"