fgrep 문자열의 전역 확장 방지

fgrep 문자열의 전역 확장 방지

crontab이 명령이 누락된 Busybox 배포판을 개발 중입니다 . 텍스트 파일에 나열된 작업으로 루트의 crontab 파일을 업데이트하는 bash 스크립트를 만들고 싶습니다. fgrep을 사용하여 cron 파일에서 작업을 찾으려고 할 때 문자를 *전역 변수로 확장하고 모든 것이 중단되는 것을 제외하면 대부분의 스크립트가 잘 작동합니다.

# Notes: CRONJOBS_LIST is the text file containing new jobs.
#        CRONJOBS_DIR is the directory where the new jobs will be installed.
#        CRONTAB_FILE is /etc/cron/crontabs/[user].

# Find each job in the crontab file. If not found, append it.
while read -r job; do
    if ! fgrep -q "$job" "$CRONTAB_FILE"; then
        # Appending file in loop avoids adding duplicate jobs if any are found in list
        echo "$job" >> "$CRONTAB_FILE"
        echo "Added '$job' to $CRONTAB_FILE"
    else
        echo "'$job' already found in $CRONTAB_FILE"
    fi
# Replace variable references in job list with correct paths
done < <(sed -e "s|\$CRONJOBS_DIR|$CRONJOBS_DIR|" "$CRONJOBS_LIST")

누구든지 다음과 같은 줄로 스크립트를 수정하도록 도와줄 수 있습니까 CRONJOBS_LIST?

2 0 * * * bash $CRONJOBS_DIR/sysbak.sh backup

*s를 전역 변수로 확장 하지 않고 grep이 될까요 ?

답변1

당신이 하려는 것이 무엇인지 이해한다면 파일에서 파일 $ADD로 줄을 추가하고 싶지만 $TARGET이미 있는 줄은 추가하지 않으려고 합니까?

반복되는 grep보다 더 쉬운 방법이 있을 수 있다고 생각합니다.comm첫 번째, 두 번째 또는 두 파일 모두에만 존재하는 줄을 제공할 수 있으므로 이를 사용해 보겠습니다.

comm -23 <(sort "$ADD") <(sort "$TARGET") > tmp ; cat tmp >> "$TARGET"

논쟁의 -23의미아니요파일 2에 존재하는 행만 표시하고아니요(3) 두 가지 모두에 존재하는 행을 표시합니다. 입력을 정렬해야 합니다. 안전을 위해 임시 파일을 통해 추가하겠습니다.

무차별 대입 솔루션 sortuniq작동할 수 있습니다.

cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"

물론 이렇게 하면 결과 파일이 정렬됩니다(기존 중복 줄은 제거됩니다).

(물론 더 만들고 싶을 수도 있지만고유한 임시 파일 이름.)


현재 코드에서는 일치하는 항목이 발견되면 0이 반환되고 대부분의 프로그래밍 환경과 달리 쉘 스크립트에서는 0이 true로 작동하기 fgrep때문에 조건이 반대라고 생각합니다. grep또한 something | while read ...동일하게 작동 해야 while... < <(something)하지만 읽기가 더 쉬울 수 있습니다.

관련 정보