与えられたパスの最後の文字を印刷します。

与えられたパスの最後の文字を印刷します。

"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"

おすすめ記事