Shell脚本用于创建具有变量名称的目录和子目录

时间:2015-09-02 11:15:33

标签: bash shell

我正在尝试创建由cron运行的脚本,以创建包含子文件夹的多个文件夹。

DATE=`date +%Y-%m-%d`
IP_ADDR=`ifconfig | grep -v '127.0.0.1' | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p'`
/bin/mkdir -p /mnt/db-backup/12/$DATE/$IP_ADDR/

如果我手动运行此脚本,则会按预期创建所有内容。当cron子目录运行脚本时,不会创建$ IP_ADDR并且没有错误。

3 个答案:

答案 0 :(得分:1)

我怀疑/sbin不是cron作业运行环境的PATH的一部分。您应该指定ifconfig命令的完整路径:

IP_ADDR=$(/sbin/ifconfig | grep -v '127.0.0.1' | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p')

使用$()进行命令替换也是一种更好的做法(一般情况下)。

答案 1 :(得分:0)

尝试使用调试模式:

set -x
DATE=`date +%Y-%m-%d`
IP_ADDR=`ifconfig | grep -v '127.0.0.1' | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p'`
/bin/mkdir -p /mnt/db-backup/12/$DATE/$IP_ADDR/
set +x

然后,将您的cron的输出重定向到一个文件并查看,您应该在其中找到有用的信息。

答案 2 :(得分:0)

你并不遥远,但有几个可能导致问题的订购警告。许多系统具有ifconfig输出行的不同格式。一些人使用inet xxx.xxx.xxx.xxx,另一些人使用inet addr:xxx.xxx.xxx.xxx。 (这是最常见的两个)。您可能还需要处理存在多个有线inet接口(框中有2个以上NIC)的情况。但是,如果您只有1个NIC,则可以尝试以下操作来处理常见的ifconfig格式:

DATE=`date +%Y-%m-%d`
IP_ADDR=$(ifconfig | 
          grep -v '127.0.0.1' | 
          grep -E 'inet[ ](addr:)*[0-9]{1,3}([.][0-9]{1,3}){3}' | 
          sed -e 's/^.*inet \(addr:\)*//' -e 's/ .*$//')
/bin/mkdir -p /mnt/db-backup/12/$DATE/$IP_ADDR/

或将IP_ADDR写成一行:

IP_ADDR=$(ifconfig | grep -v '127.0.0.1' | grep -E 'inet[ ](addr:)*[0-9]{1,3}([.][0-9]{1,3}){3}' | sed -e 's/^.*inet \(addr:\)*//' -e 's/ .*$//')