Bashスクリプトには次の機能があります。
テストlibrary.sh:
#!/bin/bash
function valcurl {
if [[ $1 != "" ]] then
tbl=$2 # can be multiple values
data=/home/data
btic=$data/$tbl"_btic"
kline=$data/$tbl"_kline"
if [[ "$1" == "btic" ]] then
errbtic=$data/$tbl"_btic_err"
elif [[ "$1" == "kline" ]] then
errkline=$data/$tbl"_kline_err"
fi
# how do I replace the parameter $1 to call the variable?
cat $1 | jq . 2> $"err"$1
if [[ -z $"err"$1 ]] then
echo "correct"
else
echo "contain error"
fi
else
echo "Not var found, only btic or kline"
fi
}
valcurl $1 $2
これは可能ですか、それとも別の方法がありますか?
答え1
関数の引数の1つに基づいて、エラー出力を特定のファイルに移動したいようです。これには2つの別々の変数は必要ありません。
if [[ "$1" == "btic" ]]; then
err="$data/${tbl}_btic_err"
elif [[ "$1" == "kline" ]]; then
err="$data/${tbl}_kline_err"
fi
そうでなければ
err="$data/${tbl}_${1}_err"
その後、電話してくださいjq
。
jq . <"$1" 2>"$err"
あなたのコードでいくつかの問題を見つけました。以下で問題を解決しようとしました。
#!/bin/bash
valcurl () {
if [ "$1" != 'btic' ] && [ "$1" != 'kline' ]; then
echo 'first argument has to be btic or kline' >&2
return 1
fi
if [ -z "$2" ]; then
echo 'second argument must not be empty' >&2
return 1
fi
datadir=/home/data
datafile="$datadir/${2}_$1"
err="${datafile}_err"
if jq . <"$datafile" 2>"$err"; then
echo 'correct'
else
echo 'contains error'
fi
}
valcurl "$1" "$2"
私はそれがあなたが送信したい最初と2番目の引数で構成されたデータファイルであり、失敗の終了ステータスをjq
確認したいとします。jq
有効なJSONファイルでなければjq
失敗します。$datafile
また、各バリアントに対して別々の変数を生成しないことでコードを短縮し、$1
いくつかのパラメータ検証を追加しました。