0

我正在尝试在 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

任何帮助将不胜感激。

谢谢

4

2 回答 2

2

不知何故,您的命令正在向您的变量引入回车,当变量不是最后一件事时,这会影响输出echo。您可以通过传递值来确认这一点hexdumpor od

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
于 2013-07-24T12:50:34.667 回答
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 美元,而不是附加到当天。

于 2013-07-24T15:17:26.357 回答