0

ファイルまたはユーザーから入力を受け取る小さなスクリプトを作成しようとしています。その後、空白行を取り除きます。

ファイル名が指定されていない場合、ユーザーに入力を求めるようにしようとしています。また、手動入力をファイルに出力してからコードを実行するか、変数に保存する最良の方法はありますか?

これまでのところ私はこれを持っていますが、ファイルで実行すると、必要な出力を返す前に1行のエラーが発生します。エラーは言う./deblank: line 1: [blank_lines.txt: command not found

if [$@ -eq "$NO_ARGS"]; then  
cat > temporary.txt; sed '/^$/d' <temporary.txt  
else  
sed '/^$/d' <$@  
fi

どこが間違っていますか?

4

4 に答える 4

0

[と の前後にスペースが必要です]。bash では、[コマンドであり、bash がそのように解釈するには、その前後にスペースが必要です。

を使用して、引数の存在を確認することもできます(( ... ))。したがって、スクリプトは次のように書き直すことができます。

if ((!$#)); then
  cat > temporary.txt; sed '/^$/d' <temporary.txt
else
  sed '/^$/d' "$@"
fi

最初の引数のみを使用したい場合は、$1(でなく$@) と言う必要があります。

于 2013-08-10T11:03:22.967 に答える
0

ファイルへのユーザー入力を強制する代わりに、指定されたファイルを標準入力に強制します。

#!/bin/bash

if [[ $1  &&  -r $1 ]]; then
    # it's a file
    exec 0<"$1"
elif ! tty -s; then
    : # input is piped from stdin
else
    # get input from user
    echo "No file specified, please enter your input, ctrl-D to end"   
fi

# now, let sed read from stdin
sed '/^$/d'
于 2013-08-10T19:26:37.110 に答える
0

これを使ってみてください

if [ $# -eq 0 ]; then  
  cat > temporary.txt; sed '/^$/d' <temporary.txt  
else  
  cat $@ | sed '/^$/d'  
fi

[と の間にはスペースが必要です の$@使い方は$@よくありません。$@すべての引数を表し、-eq数値の比較に使用されます。

于 2013-08-10T11:01:38.537 に答える
0

ここには複数の問題があります。

  1. 角括弧 [ ] と変数の間にはスペースを空ける必要があります。

  2. 文字列型を使用する場合、-eq は使用できません。代わりに == を使用してください。

  3. 文字列比較を使用する場合は、二重角括弧を使用する必要があります。

したがって、コードは次のようになります。

if [[ "$@" == "$NO_ARGS" ]]; then
cat > temporary.txt; sed '/^$/d' <temporary.txt
else
sed '/^$/d' <$@
fi

または、代わりに $# を使用します。

于 2013-08-10T12:43:08.823 に答える