"comnp.dat_CY*"
ファイルを1つのファイルにリンクしようとしています。ファイル名、ソースパス、およびターゲットパスはパラメータです。パスの最後の文字があるかどうかを確認しようとしています"/"
。ところで、これをしようとするとエラーが発生します。以下は私のスクリプトです
if [ "$#" -ne 3 ]; then
echo "Script requires 3 inputs"
echo "1. File pattern (comnp.dat_CY)"
echo "2. Source path"
echo "3. Destination path"
exit
fi
last_char1 = `echo $2|awk -F '{if (NF>1) {print $NF}}`
last_char2 = `echo $3|awk -F '{if (NF>1) {print $NF}}`
if [ $last_char1 != "/" ];then
ap_src_path = "$2/"
fi
if [ $last_char2 != "/" ];then
ap_dest_path = "$3/"
fi
cat $ap_src_path$1* > $ap_dest_pathcomnp.dat
私のエラーは次のとおりです。
comnp.sh: Broken pipe
comnp.sh[14]: last_char1: not found
comnp.sh[15]: last_char2: not found
comnp.sh[17]: test: argument expected
comnp.sh[20]: test: argument expected
私のスクリプトに何の問題がありますか?
使っていますksh AIX
答え1
シェル構文の変数の割り当てにはスペースは使用できません。パラメータと呼び出しを使用するコマンドですlast_char = ...
。シェル変数に格納された割り当て。last_char
=
....
last_char=...
...
last_char
必要なものを達成するより効率的で直接的な方法は次のとおりです。
case $2 in
*/) ap_src_path=$2;;
*) ap_src_path=$2/;;
esac
case $3 in
*/) ap_dest_path=$3;;
*) ap_dest_path=$3/;;
esac
単純比較を実行するために最後の文字を抽出する必要はありません。さらに、このような単純なシェル変数操作に対するコマンドの置換は非効率的で扱いにくい。
さらに、これをまったく実行する必要はありません。ほとんどの場合、Unixのパスチェックは気にしません。繰り返しスラッシュ、同様にpath///to//a/file
有効ですpath/to/a/file
。スクリプトでは、重複を心配することなくこれを利用できます/
。つまり、スクリプト全体を次のように置き換えることができます。
if [ $# -ne 3 ]; then
# ... same as above ...
fi
pattern=$1
ap_src_path=$2
ap_dst_path=$3
cat "$ap_src_path/$pattern"* > "$ap_dest_path/compn.dat"
答え2
ここで問題はあなたです。できない周辺空間を活用してください=
。シェルはこれについて非常に面倒です。そして、awk
順序に完全に間違っているものがあります。
そして2014年はバックティックよりもうまく機能します$( )
。したがって、awk
その行は次のようになります。
last_char1=$(echo "$2" | awk '{print $NF}' FS='')
last_char2=$(echo "$3" | awk '{print $NF}' FS='')
答え3
答え4
スクリプトにはいくつかの問題があります。周囲にスペースを入れてはいけません。=
一重引用符はペアに'
しないでください。awk -F
フィールド区切り記号というパラメータも1つ必要ですawk -F '' '{if (NF>1) {print $NF}}'
。
bash
しかし、実際にはorのような合理的なシェルを使うとzsh
簡単に書くことができます。
cat "${ap_src_path}/${1}*" > "${ap_dest_path}/comnp.dat"
最後の文字とこれらすべてのif
条件は必要ありません。可能な追加コンテンツ/
は無視されるため、たとえばパスは/var//log///mysql////mysql.log
完全に構文的です。