0

私はプログラミングがまったく初めてというわけではありませんが、まったく経験がありません。練習用に小さなシェルスクリプトを書きたいです。

これが私がこれまでに持っているものです:

#!/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

基本的に私がやろうとしているのは、指定されたディレクトリ内のすべてのファイルをスクリプトで処理し、各ファイルの名前と、そのファイルのリンク数、所有者、および作成日を表示することです。作成日または少なくともファイルの最終変更日を表示するための構文は何ですか?

もう 1 つは、for ループを作成するための構文は何ですか? 私が理解していることから、$1 in $1 ($1 は、ユーザーが入力したディレクトリ内のすべてのファイルが正しいですか?) のようなものを記述し、各ファイルをチェックして、それぞれの情報を表示する必要があります。for ループを開始および終了するにはどうすればよいですか (これの構文は何ですか?)。

ご覧のとおり、私は bourne shell プログラミングにあまり詳しくありません。役立つウェブサイトや、より良いアプローチ方法があれば教えてください。

4

6 に答える 6

4

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オンザフライでフィールドに分割するため、自分で分割する必要はありません。

フィールド分割はシェル変数 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 を元に戻す必要はありませんが、通常は、スクリプトでのテキスト処理が完了した後に影響を受けないようにするために行います)。

forwhileループの両方に関するドキュメントがたくさんあります。グーグルで検索してください:-)

于 2009-11-23T15:50:36.507 に答える
3

$1は最初の位置パラメータで$3あり、3番目と$44番目です。これらは、スクリプトが開始されたディレクトリ(またはそのファイル)とは何の関係もありません。スクリプトがこれを使用して開始された場合、次に例を示します。

./script.sh apple banana cherry date elderberry

その場合、変数$1は「apple」などに等しくなります。特別なパラメータ$#は位置パラメータの数であり、この場合は5になります。

スクリプトの名前はとに含まれ$0ており$*$@引用符で囲まれているかどうかによって動作が異なるすべての位置パラメーターを含む配列です。

サブストリングスタイルのインデックスを使用して、位置パラメータを参照できます。

${@:2:1}

上記の例を使用して「バナナ」を与えます。と:

${@: -1}

また

${@:$#}

最後(「ニワトコ」)を与えるでしょう。このコンテキストでは、マイナス記号の前にスペースが必要であることに注意してください。

于 2009-11-23T20:15:49.497 に答える
2

findオプションで使用することをお勧めします-printf "%P\t%n\t%u\t%t"

于 2009-11-23T15:54:56.747 に答える
2

Advanced Bash-Scripting Guideを見たいと思うかもしれません。ループについて説明するセクションがあります。

于 2009-11-23T15:47:15.437 に答える
1

システム上でGNUが見つかったと仮定します

find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"
于 2009-11-23T16:19:10.723 に答える
1
for x in "$@"; do
    echo "$x"
done

「$@」は、指定されたファイル名の空白を保護します。明らかに、あまり効果のない「echo $x」の代わりに実際の作業を行ってください。しかし、$@ は、コマンド ラインでスクリプトに提供されるすべてのジャンクです。

また、$# が 1 に等しくない場合、スクリプトは救済されますが、明らかに最大 4 つの引数を期待しているようです (したがって、スクリプトの最初の部分で参照する $4 です)。

于 2009-11-23T16:03:32.767 に答える