shell $ character会覆盖前一个变量

时间:2013-07-23 11:40:27

标签: shell sh freebsd

我正在尝试在shell上编写一个脚本,但我仍然坚持一个观点。

我有一个程序每天创建数据并将其放到这样的目录:home/meee/data/2013/07/22/mydata

我的问题是我正在尝试使用日期更改目录。这是我的剧本:

#!/bin/sh

x=$(date -u -v-2H "+%Y-%m-%d")
echo $x
year=$(echo $x | cut -d"-" -f1)
month=$(echo $x | cut -d"-" -f2)
day=$(echo $x | cut -d"-" -f3)
echo $year
echo $month
echo $day

d1='/home/sensor/data/'${year}/${month}
echo $d1

没有与year, day, month相关的问题,它们正在发挥作用。但echo d1的输出为/07me/sensor/data/2013。同样,当我写echo $year$day时,它会给2312 (characters of day is overwritten on the first two characater of the year)

我尝试了许多其他语法,而不是'字符放置"或将其留空。正在删除{等。但没有改变。

很快,当我在同一行写两个变量($var1 $var2)时,第二个$的行为就像转到行的开头并开始覆盖第一个变量。

我一直在寻找,但没有任何相关的内容,或者我找不到任何相关内容,Stackoverflow中有很多解决方案使用$var1$var2来解决问题

我做错了什么,或者我该如何解决。

我正在使用 FreeBSD 9.0-RELEASE amd64 并使用 sh

任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

不知何故,你的命令正在向你的变量引入回车,当变量不是最后一个echo时,它会影响输出。您可以通过将值传递到hexdumpod

来确认这一点
printf "%s" "$x" | hexdump -C   # Look for 0d in the output.
printf "%s" "$year" | hexdump -C   # Look for 0d in the output.
printf "%s" "$month" | hexdump -C   # Look for 0d in the output.
printf "%s" "$day" | hexdump -C   # Look for 0d in the output.

我不认为这会解决这个问题,但你可以获得年,月,日而不需要这么多外部程序:

IFS=- read year month day <<EOF
$(date -u -v-2H "+%Y-%m-%d")
EOF

或更简单

read year month day <<EOF
$(date -u -v-2H "+%Y %m %d")
EOF

答案 1 :(得分:0)

你很可能在Windows®上使用MinGW或其他一些非常非常Unix的环境,它在行尾(来自Unix PoV)引入了回车(CR,\ r)字符。

所以将此更改为:

x=$(date -u -v-2H "+%Y-%m-%d" | sed $'s/\r$//')
echo $x
year=$(echo $x | cut -d"-" -f1 | sed $'s/\r$//')
month=$(echo $x | cut -d"-" -f2 | sed $'s/\r$//')
day=$(echo $x | cut -d"-" -f3 | sed $'s/\r$//')

或者,甚至更好:

x=$(date -u -v-2H "+%Y %m %d ")
echo $x
set -- $x
year=$1
month=$2
day=$3

请注意%d之后的额外空格,以确保CR将变为$ 4而非附加到当天。