0

ここに画像の説明を入力してくださいシェル スクリプトがどのように動作し、どのように実行するかを確認しようとしていたので、図書館から拾った「Wicked Cool Shell Scripts」という本からサンプル コードをいくつか取り上げました。

コードをそのまま書き直しましたが、Linux からエラーが発生しました。

'd.sh: 3 行目: 予期しないトークン付近で構文エラーが発生しました `{

'd.sh: 3行目:`gmk() {

この前に、改行に中括弧がありましたが、まだ取得していました:

'd.sh: 3 行目: 予期しないトークンの近くで構文エラーが発生しました

'd.sh: 3 行目:`gmk()

#!/bin/sh
#format directory- outputs a formatted directory listing 
gmk()
 {
#Give input in Kb, output converted to Kb, Mb, or Gb for best output format
    if [$1 -ge 1000000]; then
        echo "$(scriptbc -p 2 $1/1000000)Gb"
    elif [$1 - ge 1000]; then
        echo "$$(scriptbc -p 2 $1/1000)Mb"
    else
        echo "${1}Kb"
        fi
}

    if [$# -gt 1] ; then 
        echo "Usage: $0 [dirname]" >&2; exit 1
    elif [$# -eq 1] ; then 
        cd "$@"
        fi

    for file in *

    do 
        if [-d "$file"] ; then
            size = $(ls "$file"|wc -l|sed 's/[^[:digit:]]//g')
        elif [$size -eq 1] ; then
            echo "$file ($size entry)|"
        else
            echo "$file ($size entries)|"
    fi
        else
            size ="$(ls -sk "$file" | awk '{print $1}')"
            echo "$file ($(gmk $size))|"
    fi
    done | \
      sed 's/ /^^^/g' |\
      xargs -n 2 |\
      sed 's/\^\^\^/ /g' | \
      awk -F\| '{ printf "%39s %-39s\n", $1, $2}'
      exit 0

    if [$#-gt 1]; then 
        echo "Usage :$0 [dirname]" >&2; exit 1
    elif [$# -eq 1]; then 
        cd "$@"
    fi

    for file in *
        do
            if [ -d "$file" ] ; then
                size =$(ls "$file" | wc -l | sed 's/[^[:digit:]]//g')
            if [ $size -eq 1 ] ; then
                echo "$file ($size entry)|"
            else
                echo "$file ($size entries)|"
                fi
            else
                size ="$(ls -sk "$file" | awk '{print $1}')"
                echo "$file ($(convert $size))|"
                fi
done | \
    sed 's/ /^^^/g' | \
    xargs -n 2 | \
    sed 's/\^\^\^/ /g' | \
    awk -F\| '{ printf "%-39s %-39s\n", $1, $2 }'

    exit 0

本に出てくるコード

4

2 に答える 2

0

ところで、あなたの PATH 変数を変更するように言っている本に関しては、それは本当に悪い考えです。明確にするために、現在のディレクトリを PATH 変数に追加しないでください。そのディレクトリをすべてのスクリプトなどの永続的な場所にするつもりがある場合を除きます。これをスクリプトの永続的な場所にする場合は、必ず場所を追加してください。 PATH 変数の先頭ではなく END を使用してください。そうしないと、重大なセキュリティ上の問題が発生します。

Linux と Unix は、現在の場所 (一般に PWD と呼ばれる現在の作業ディレクトリ) をパスに追加しません。これは、誰かが「ls」というスクリプトを作成する可能性があるためです。たとえば、実際の「ls」コマンドの代わりに悪意のあるものを実行する可能性があります。 . PWD で何かを実行する適切な方法は、先頭に「./」を追加することです (例: ./my_new_script.sh)。これは基本的に、PWD から何かを実行したいということを示しています。シェルに「ここに」と伝えることと考えてください。「。」実際には現在のディレクトリ、つまり「ここ」を表します。

于 2013-12-12T17:35:00.153 に答える
0

sh はスペースに非常に敏感です。特に、代入 ( の周り=にスペースを入れないでください) とテスト ( の中にスペースを入れる必要があります[ ])。

このバージョンは実行されますが、scriptbc.

elsifあるはずの場所に を置きますif

開始と終了の間の列の位置合わせに注意してください。それらを一致させないと、これがどのように機能するかを考える際に簡単に迷子になります。

set -xまた、スクリプトの先頭近くに を追加することは、スクリプトが実行していることをデバッグするための非常に良い方法です。実行しようとしている各行を、実行前にインタープリターが出力するようになります。

#!/bin/sh
#format directory- outputs a formatted directory listing
gmk()
{
#Give input in Kb, output converted to Kb, Mb, or Gb for best output format
    if [ $1 -ge 1000000 ]; then
        echo "$(scriptbc -p 2 $1/1000000)Gb"
    elif [ $1 -ge 1000 ]; then
        echo "$(scriptbc -p 2 $1/1000)Mb"
    else
        echo "${1}Kb"
    fi
}

if [ $# -gt 1 ] ; then
    echo "Usage: $0 [dirname]" >&2; exit 1
elif [ $# -eq 1 ] ; then
    cd "$@"
fi

for file in *
do
    if [ -d "$file" ] ; then
        size=$(ls "$file"|wc -l|sed 's/[^[:digit:]]//g')
        if [ $size -eq 1 ] ; then
            echo "$file ($size entry)|"
        else
            echo "$file ($size entries)|"
        fi
    else
        size="$(ls -sk "$file" | awk '{print $1}')"
        echo "$file ($(gmk $size))|"
    fi
done | \
  sed 's/ /^^^/g' |\
  xargs -n 2 |\
  sed 's/\^\^\^/ /g' | \
  awk -F\| '{ printf "%39s %-39s\n", $1, $2}'
  exit 0
于 2013-08-05T09:25:20.160 に答える