주어진 경로의 마지막 문자를 인쇄합니다.

주어진 경로의 마지막 문자를 인쇄합니다.

"comnp.dat_CY*"파일을 하나의 파일로 연결 하려고 합니다 . 파일 이름, 소스 경로 및 대상 경로는 매개변수입니다. 경로의 마지막 문자가 인지 확인하려고 합니다 "/". 그런데 이렇게 하려고 하면 오류가 발생합니다. 아래는 내 스크립트입니다

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필드 구분 기호라는 매개변수도 하나 필요하므로 를 작성해야 합니다 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완벽하게 구문적입니다.

관련 정보