다음 문자열을 파일에 쓰려고 합니다: 1;2;3;4
. 세미콜론은 문제를 일으킬 수 있습니다.
나는 이 작업을 수행하기 위해 다음과 같은 방법을 알아낼 수 있었습니다.
variable='1;2;3;4'
echo "${variable//;/\;}" >output.file
그러나 어떤 이유로 crontab을 실행하면 출력 파일이 생성되지 않으며 수동으로 실행하는 경우에만 작동합니다.
내 코드에 대한 대안이 있습니까?
답변1
여기에는 두 가지 문제가 있습니다. 먼저 ;
로 바꾸려면 을 \;
이스케이프해야 합니다 \
. 이것은 \
특수 문자이며 이스케이프에 사용된다는 점을 기억하십시오(이것이 아마도 이전에 추가한 이유일 것입니다 ;
). 문자 그대로 사용하려면 대체에서도 이스케이프해야 합니다.
$ variable='1;2;3;4'
$ echo "${variable//;/\;}" ## fails
1;2;3;4
$ echo "${variable//;/\\;}" ## works
1\;2\;3\;4
다음 문제는 Cuonglm이 지적했듯이 cron이 모든 것을 실행한다는 것입니다 /bin/sh
. 시스템에 따라 이는 sh 호환 모드에서 실행되는 bash이거나 다른 최소 셸( dash
Debian 기반 시스템의 경우) 또는 심지어 고대 Bourne 셸 자체일 수도 있습니다. 따라서 이 ${var//foo/bar}
구성은 작동하지 않을 가능성이 높습니다. 예를 들면 다음과 같습니다 dash
.
$ variable='1;2;3;4'
$ echo "${variable//;/\\;}"
dash: 2: Bad substitution
그러나 변수에 포함된 문자열을 파일로 인쇄하려는 경우에는 항상 작동합니다.
variable='1;2;3;4'
printf '%s\n' "$variable" > file