如何在linux shell脚本中使用变量遍历路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在linux shell脚本中使用变量遍历路径相关的知识,希望对你有一定的参考价值。

我写了一个shell脚本来复制当前日期的文件,并将它们放在目标文件夹中,并带有当前日期名称,目标文件夹路径包含变量。当我手动运行cd或cp命令时,此路径工作正常,但在shell脚本中,在通过cp复制时,无法识别带变量的目录。

d=`date +%b' '%d`
td=`date +%d%b%Y`
cd /filenet/shared/logs
mkdir $td
cd $td
mkdir icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03

ssh hostname <<'ENDSSH'
cd /<some_path>
ls -ltrh | grep "$d" | awk {'print $9'} | xargs cp -t /filenet/shared/logs/"${td}"/GC
ENDSSH

错误

-ksh[2]: td: not found [No such file or directory]
cp: failed to access ‘/filenet/shared/logs//GC’: No such file or directory
答案

我建议更换

$(td)

${td}
另一答案

此脚本的更正版本可能看起来更像以下内容:

#!/usr/bin/env bash
#              ^^^^- ksh93 also allowable; /bin/sh is not.

d=$(date '+%b %d')      || exit
td=$(date '+%d%b%Y')    || exit

cd /filenet/shared/logs || exit
mkdir -p -- "$td"       || exit
cd "$td"                || exit
mkdir -p -- icn02 icn03 GC cpe01 cpe02 cpe03 cpeb01 cpeb02 icn01 css01 css02 http01 http02 http03 || exit

# these should only fail if you're using a shell that isn't either bash or ksh93
d_q=$(printf '%q' "$d")   || exit
td_q=$(printf '%q' "$td") || exit

ssh hostname "bash -s ${d_q} ${td_q}" <<'ENDSSH'
d=$1
td=$2
cd /wherever || exit
find . -name "*${d}*" -exec cp -t "/filenet/shared/logs/${td}/GC" -- {} +
ENDSSH

注意:

  • 当使用引用的heredoc(<<'ENDSSH')时,heredoc中的扩展不受尊重。要复制变量,将它们移出带外 - 在这里,我们使用printf %q生成eval-safe的值的转义副本,并使用bash -s将它们放在shell命令行($1$2)中。
  • Never, ever grep or parse the output of ls

以上是关于如何在linux shell脚本中使用变量遍历路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux中使用shell脚本遍历指定目录的文件,将创建时间大于指定时间的文件,复制到指定目录下。

如何在Windows下运行linux shell脚本

交互式shell脚本遍历文件目录下的所有文件和目录(绝对路径)

如何执行shell脚本其中一条命令

linux Shell PATH变量用法详解:系统查找命令的路径

交互式shell脚本遍历文件目录下的所有文件和目录(绝对路径)