Bashのforループ

Bashのforループ

1から変数に格納された数まで実行されるforループを作成したいと思います。ただし、次のエラーが発生します。

構文エラー:ループ変数の誤った内容

これは私のスクリプトです。

#!/bin/bash

count_lines () 
{
  local f=$1  
  l=`wc -l $f | sed 's/^\([0-9]*\).*$/\1/'`
}
echo "$0 counts the lines of code" 
l=0
while [ "$*" != ""  ]
do
        count_lines $1
        echo "$1: $l"
        shift
done
for(( i= 0 ; i <= ${l} ; i++))
do
   title=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0")
   echo "$title"
done

ベストアンサー1

スクリプトが実行可能であることを確認し、コマンド(パスを含む)を入力してスクリプトを実行します。たとえば、スクリプトが呼び出されfooて現在ディレクトリにある場合は、次のように実行します。

./foo

エラーメッセージが表示されたら、同様のことをしていますsh foo。コンピュータで使用されているforループ構文をサポートしていない他のシェル(おそらくダッシュ)がありますsh。を実行すると、最初の行に記載されているbashシェルによってスクリプトが実行されます。bashsh./foo

スクリプトにはいくつかの奇妙な部分があります。

  • 変数の置換には常に二重引用符を使用してください。"$1"、、、"$f"など。
  • このwhile [ "$*" != "" ] …ループは、スクリプトパラメータを繰り返す非常にバイパス的な方法です。シンプルで慣用的な方法は次のとおりです。

    for x; do
      count_lines "$x"
    done
    

    または

    for x in "$@"; do
      count_lines "$x"
    done
    
  • 何をしたいのかわかりませんtitle=$(grep -oPm1 "(?<=<title>)[^<]+" <<< "$0")"$0"スクリプトパスなので、(?<=<title>)[^<]+スクリプトパスから正規表現を検索していますが、これは意味がありません。

おすすめ記事