我在bash脚本中有一个sed命令,用一个变量的值替换文件中的第10行。 好的停止混乱(这是我的错,这是完整的脚本:
#!/bin/bash
#Sync timezone between system and php
##get current timezone of system
line=$(head -n 1 /etc/sysconfig/clock)
timezone=${line:6}
##Set up php date string
time="date_default_timezone_set('${timezone%?}');"
sed -i 10s|.*|$time| test.php
所以时间会有如下值:
date_default_timezone_set( '欧洲/伦敦')
现在给出了这些错误:
> test.php: Permission denied
> date_default_timezone_set('Europe/London);: Not such file or direcotry
> .: .:: is a directory
> sed: -e expression #1. char 3: unterminated 's' command
任何帮助都会很棒,如果您需要更多信息,请告诉我们!
答案 0 :(得分:1)
time='date_default_timezone_set\("\$timezone"\);'
请注意,我也改变了引号的样式。这是必要的,因为PHP在使用单引号时不会替换变量。
您还可以在引号中附上$ time,但如果$timezone
是实际变量,则仍需要双引号:
time='date_default_timezone_set("$timezone");'
sed -i 10s/.*/"$time"/ test.php
根据您对问题的更新,我的理解是您实际上使用的是字符串常量来代替$timezone
,因此这可能不适用。在这种情况下,最干净的选择是:
time='date_default_timezone_set("America/New_York");'
sed -i 10s/.*/"${time/\//\\/}"/ test.php
请注意,这需要bash处于“bash”模式,而不是“sh”模式。确保您在任何脚本的顶部都有#!/bin/bash
。
答案 1 :(得分:1)
遗憾的是,获取时区不是便携式的,但通常/ etc / localtime是指向您时区的符号链接,因此您可以:
tz=$(readlink /etc/localtime | sed 's:\(.*\)/\([^/]*\)/\([^/]*\)$:\2/\3:')
echo ==$tz==
你会得到像==Europe/London==
这样的东西。现在你可以构造你的字符串
time="date_default_timezone_set('$tz');"
并在sed中使用它 - 但是不要使用/
作为分隔符(因为包含它的时间刺激并且混淆了你的sed)
sed -i "10s:.*:$time:" test.php
答案 2 :(得分:0)
由于timezone
包含/
字符,您需要做一些特别的事情:
sed -i 10s@.*@$time@ test.php
您可以使用源字符串和目标字符串中未出现的任何字符。在这里,我选择了@
。