또 막혔어요. 이 경우 명령줄에 파일 이름을 입력할 때 텍스트 변환을 수행하기 위해 지난 주 작업을 수행하려고 합니다. 지난 주의 스크립트는 열을 제거하고 재정렬하여 일부 문자를 바꾸고 일부 공백을 제거했습니다. 이번 주의 과제에는 if/then 매개변수를 포함하도록 스크립트를 수정해야 합니다.
이것이 내가 지금까지 가지고 있는 것입니다:
if [ $# -gt 0 ]
then
./hw9.sh
else
echo "Please enter a filename"
fi
name=First \Last
echo $name
starting_info=raw_info
date
#Pretend the rest of my original script is here#
따라서 테스트하고 에 입력하면 ./hw9.sh raw_info
작동하지만 여전히 Please enter a filename
원래 ./hw9.sh
스크립트를 두 번 에코하고 실행합니다. Please enter a filename
사용자가 명령줄에 입력만 하면 에코가 발생하고 ./hw9.sh
, 사용자가 입력하면 원래 스크립트가 실행되어야 합니다../hw9.sh raw_info
누구든지 지침을 제공할 수 있습니까? 감사합니다!
답변1
귀하의 설명에 따르면 귀하는 호출된 스크립트가 있고 hw9.sh
재귀 실행 조건을 설정했다고 생각됩니다.
을 실행하면 hw9.sh raw_info
조건 if
이 true(=1)이고 $#
스크립트가 실행됩니다. hw9.sh
이 중첩 실행에서는 if
조건이 false( $#
=0)이므로 스크립트가 프롬프트를 에코하고 거기에서 실행을 계속합니다. 중첩된 실행이 완료되면 제어가 상위 스크립트로 돌아가고 본문 뒤의 스크립트의 나머지 부분이 실행됩니다 if
. 따라서 스크립트는 실제로 두 번 실행됩니다.
재귀를 사용하는 대신 이와 같은 조건을 사용하여 위치 인수 없이 사례를 포착할 수 있습니다.
if [[ $# -eq 0 ]];
then echo 'A filename is required.'
exit 1
fi
이는 여러 위치 매개변수가 있는 경우나 매개변수가 문자열 "raw_info"가 아닌 경우를 고려하지 않습니다. 이것을 추가하는 것을 고려할 수도 있습니다.
또한 최종 스크립트를 모범 사례와 일관되게 유지하려면 다음을 확인하세요.https://www.shellcheck.net/.
답변2
실제로 파일 이름을 받아들이고 이를 사용하여 작업을 수행하지 않는 경우 파일 이름을 묻는 것은 의미가 없습니다. 따라서 파일이 제공되고 유효한 일반 파일인 경우 스크립트가 파일에서 작동하도록 하고, 파일이 제공되지 않으면 스크립트가 기본 파일 이름에서 작동하도록 합니다. 또한 몇 가지 기본적인 오류 검사를 추가합니다.
#!/bin/bash
## Set the default input file
file_name="raw_info"
# Exit if we have more than one argument
if [ $# -gt 1 ]; then
echo "This script can only take one argument." >&2
exit 1
# If we have exactly one argument, check that it is an existing file
elif [ $# -eq 1 ]; then
if [ -f "$1" ]; then
file_name="$1"
echo "I will work on provided file '$file_name'."
elif [ -d "$1" ]; then
echo "You gave '$1', but that is a directory!"
exit 2
else
echo "You gave '$1' but it isn't an existing regular file!" >&2
exit 3
fi
else
if [ -e "$file_name" ]; then
echo "No file name given, I will work on '$file_name'." >&2
else
echo "No file name given and default file name '$file_name' not found!" >&2
exit 4
fi
fi
### Assuming you want the script from https://unix.stackexchange.com/q/721051
cut -f3 -d, "$file_name" > first
cut -f2 -d, "$file_name" > last
cut -f1 -d, "$file_name" > id
스크립트는 cut
변수에 저장된 모든 파일에 대해 명령을 실행합니다. 이는 $file_name
스크립트에 인수가 제공되지 않은 경우 기본값이 되며, 인수를 전달한 경우 제공한 모든 인수가 됩니다. 오류 및 정보 메시지를 표준 오류로 보내면 raw_info
됩니다 . >&2
사용된 다양한 테스트에 대한 도움말을 보려면 help test
터미널에서 실행하세요.