작업에 대한 쉘이 있지만 그 안에서 null 값을 처리해야 합니다. 따라서 작업에서 단어의 일부를 잘라내고 파일을 삭제하거나 이름을 바꾸지만 다른 if 요소는 비어 있어야 합니다.
예를 들어,
"pear"라는 단어가 있고 이 단어와 파일 이름 null을 사용하여 모두 잘라냈습니다.
echo $fname | perl -p -e 's/:pear://g'
이제 이름을 "nullfile"로 바꿔야 합니다.
답변1
그리고 zsh
:
newname=${${fname//:pear:}:-nullfile}
bash
또는 를 사용하면 ksh93
다음 두 단계로 수행해야 합니다.
newname=${fname//:pear:}
newname=${newname:-nullfile}
POSIXly에서 문자열의 모든 항목을 제거하려면 다음을 수행해야 합니다.
newname=$(
printf '%s\n' "$fname" | sed 's/:pear://g'; echo .
)
newname=${newname%??}
newname=${newname:-nullfile}
이를 다음과 같이 단순화할 수 있습니다.
newname=$(
printf '%s\n' "$fname" | sed 's/:pear://g'
)
newname=${newname:-nullfile}
보장할 수 있다면 $fname
개행 문자로 끝나지 않을 것입니다.
답변2
#!/bin/bash
{ read -r dirname fname
read second
} < <(find . -type f -name '*:pear:*' -printf '%h %f\n')
if [ -z "$second" -a -n "$fname" ] ; then
newname="${fname/:pear:/}"
if [ -e "$dirname/${newname:=nullfile}" ] ; then
rm -f "$dirname/$newname"
echo "Deleted file $dirname/$newname"
fi
mv "$dirname/"{"$fname", "$newname"}
echo "Renamed file $dirname/$fname to $dirname/$newname"
fi
답변3
변수가 비어 있으면 매개변수 대체를 사용하여 기본값을 제공할 수 있습니다.
$ filename="string of pearls"
$ newname=$( sed 's/pear//g' <<<"$filename" )
$ echo "${newname:-nullfile}"
string of ls
$ filename=pear
$ newname=$( sed 's/pear//g' <<<"$filename" )
$ echo "${newname:-nullfile}"
nullfile
사실, sed나 perl을 호출할 필요도 없습니다. 매개변수 대체 4 teh win!
$ filename="spear pearl"
$ newname=${filename//pear/}
$ echo "${newname:-nullfile}"
s l
$ filename=pear
$ newname=${filename//pear/}
$ echo "${newname:-nullfile}"
nullfile