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

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

"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='')

確認するhttp://mywiki.wooledge.org/BashFAQ/082

答え3

last_char1=$(echo ${2:${#2}-1}); 
last_char2=$(echo ${3:${#3}-1}); 

if [[ "$last_char1" != "/" ]]; then 

ヒント:

  • $(を使用してください。注文する)前の `代わりに注文する`:引用する
  • []の代わりに[[]]を使用してください。引用する

答え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完全に構文的です。

関連情報