我是Unix的新手,正在学习Unix。最近我在脚本中遇到了这种语法,这让我在两者之间感到困惑:
G_DEST_DIR="/data/door1"
echo "mv $1 ${G_DEST_DIR}"
#&
mv $1 ${G_DEST_DIR}
根据我的情报,上面的代码将移动文件(作为参数传递)并将其移动到dest_dir
我的问题是之间有什么区别
echo "mv $1 ${G_DEST_DIR}"
和
mv $1 ${G_DEST_DIR}
如果我想移动作为参数传递的文件,我该如何进行
-
echo
命令将其参数打印到终端。当使用myFile.txt
作为第一个参数调用脚本时,这一行:echo "mv $1 ${G_DEST_DIR}"
将完全打印此(并且不会移动文件):
mv myFile.txt/data/door1
-
另一行,不以
echo
:为前缀mv $1 ${G_DEST_DIR}
将实际运行
mv
命令并将文件移动到/data/door1
目录。
脚本分析
让我们逐行分析您的脚本:
1 G_DEST_DIR="/data/door1"
2
3 echo "mv $1 ${G_DEST_DIR}"
4 #&
5 mv $1 ${G_DEST_DIR}
- 声明一个名为
G_DEST_DIR
的变量,并将字符串/data/door1
放入该变量中 - (空行)
- 只需向用户显示一条消息。shell不会读取消息;只有用户(可能)会
- 命令后面的"与"和
&
表示echo
命令将在后台执行。您的脚本不会等待命令结束,而是会移动到下一行(编辑:行在mklement0的注释后被注释掉。) - 将(
mv
命令)作为第一个参数($1
)提供的文件移动到名为/data/door1
的目录中
奖金提示
将echo
放在命令之前是一种快速有效的方法来干式运行给定的命令,也就是说,查看在没有echo
的情况下会执行什么。
echo
=显示/打印一行文本mv
=移动/重命名文件
编辑:示例:假设$1(第一个参数)是old.txt
echo "mv $1 ${G_DEST_DIR}"
将打印输出"mv old.txt/data/door1">mv $1 ${G_DEST_DIR}
将将old.txt移动到目录/data/door1
echo
不会将print放入stdout的(唯一的)参数中-其参数具有shell命令的形式并没有什么区别。
相比之下,以mv
开头的行执行实际的文件移动/重命名命令。
将echo
预处理为一个命令经常用于测试,以查看命令在执行时会做什么,而不是实际执行(一种潜在的破坏性/不可逆的操作)。
对于mv
命令:$1
引用传递给脚本的第一个参数;为了安全起见,您应该双引号引用,就像通常对变量引用("$1"
和"${G_DEST_DIR}"
)所做的那样。
echo命令显示b/w"写入的任何内容,但如果您使用任何命令,它将首先执行(如果有效),然后显示其o/p。因此,这就是为什么您的both命令会将数据移动到文件中,但在第一种情况下,带有echo的行中,语句会用move命令进行设置,但它没有o/p,因此它会根据给定的gdestdir变量显示mv,然后显示文件名。