1

我在 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

任何帮助都会很棒,如果您需要更多信息,请告诉我!

4

3 回答 3

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在任何脚本的顶部都有。

于 2013-05-03T19:22:26.763 回答
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
于 2013-05-03T19:31:00.243 回答
0

由于timezone包含/字符,您需要做一些特殊的事情:

sed -i 10s@.*@$time@ test.php

您可以使用未出现在源字符串和目标字符串中的任何字符。这里我选择了@

于 2013-05-03T19:23:21.823 回答