"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='')
답변3
답변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
완벽하게 구문적입니다.