将bash参数作为字符串传递
我有一个小问题,可能是非常愚蠢的问题 我试图为tar和gzip创建一个别名,它使用给定的文件名作为参数,但它没有按照预期转换为输出中的文件名 我的别名是:将bash参数作为字符串传递,bash,Bash,我有一个小问题,可能是非常愚蠢的问题 我试图为tar和gzip创建一个别名,它使用给定的文件名作为参数,但它没有按照预期转换为输出中的文件名 我的别名是: alias targz='tar -cvzf $1.tar.gz $1' 它可以工作,但是$1中存储的参数在设置文件名时不起作用,它将其压缩到一个名为.tar.gz的文件中 我试着回显“$1.tar.gz”,输出是“.tar.gz”,所以,我认为它的格式应该非常愚蠢 欢迎提供任何帮助,使用别名为其创建函数,例如: alias targz=
alias targz='tar -cvzf $1.tar.gz $1'
它可以工作,但是$1中存储的参数在设置文件名时不起作用,它将其压缩到一个名为.tar.gz的文件中
我试着回显“$1.tar.gz”,输出是“.tar.gz”,所以,我认为它的格式应该非常愚蠢
欢迎提供任何帮助,使用别名为其创建函数,例如:
alias targz='function targz_() { tar -cvzf "$1.tar.gz" "$1"; return 0; }; targz_ '
将别名用于函数,例如:
alias targz='function targz_() { tar -cvzf "$1.tar.gz" "$1"; return 0; }; targz_ '
别名没有位置参数。它们基本上是宏,当执行别名时,别名会被替换为别名的文本 您可以使用以下函数:
targz() {
tar -cvzf "$1".tar.gz "$1"
}
还是剧本
#!/bin/bash
tar -cvzf "$1".tar.gz "$1"
就我个人而言,我一直在使用类似于以下脚本的方法来实现类似的目标,并为您的方便添加了注释:
#!/bin/bash
#support multiple args
for arg in "$@"
do
#strip ending slash if present (tab-completion adds them)
arg=${arg%/}
#compress with pigz (faster on multicore systems)
tar c "$arg" | pigz - > "$arg".tgz
done
如果您想要我的完整版本,如果tarring和压缩成功,我也会删除参数目录,就像gzip对单个文件所做的那样
#!/bin/bash
set -o pipefail
for arg in "$@"
do
arg=${arg%/}
tar c "$arg" | pigz - > "$arg".tgz && rm -rf "$arg"
done
更新:
@mklement0更简洁、更有效地去除了结尾斜杠。别名没有位置参数。它们基本上是宏,当执行别名时,别名会被替换为别名的文本 您可以使用以下函数:
targz() {
tar -cvzf "$1".tar.gz "$1"
}
还是剧本
#!/bin/bash
tar -cvzf "$1".tar.gz "$1"
就我个人而言,我一直在使用类似于以下脚本的方法来实现类似的目标,并为您的方便添加了注释:
#!/bin/bash
#support multiple args
for arg in "$@"
do
#strip ending slash if present (tab-completion adds them)
arg=${arg%/}
#compress with pigz (faster on multicore systems)
tar c "$arg" | pigz - > "$arg".tgz
done
如果您想要我的完整版本,如果tarring和压缩成功,我也会删除参数目录,就像gzip对单个文件所做的那样
#!/bin/bash
set -o pipefail
for arg in "$@"
do
arg=${arg%/}
tar c "$arg" | pigz - > "$arg".tgz && rm -rf "$arg"
done
更新:
感谢@mklement0更简洁、更有效地去除结尾斜杠。试着编写一个脚本来实现这一点,如下所示
echo """
#!/bin/bash if [ -z $1 ]; then
echo "Variable is Null"
else
tar -cvzf $1.tar.gz $1
fi
""" > /usr/local/bin/targz
chmod +x /usr/local/bin/targz
试着制作一个脚本来实现这一点,就像这样
echo """
#!/bin/bash if [ -z $1 ]; then
echo "Variable is Null"
else
tar -cvzf $1.tar.gz $1
fi
""" > /usr/local/bin/targz
chmod +x /usr/local/bin/targz
您需要用于此操作或脚本的函数。别名不行。您需要函数或脚本。别名不行。有别名有什么好处?为什么不使用一个名为targz的函数呢?向OP展示有一种方法可以模拟别名中的位置参数似乎有点像学术练习,但是,好的,+1。使用别名的好处是什么?为什么不使用一个名为targz的函数呢?向OP展示有一种方法可以模拟别名中的位置参数似乎有点像学术练习,但是,好的,+1。你说的“别名没有位置参数”是什么意思?我使用位置参数制作了别名,它们工作正常。@Ghost:From:csh中没有在替换文本中使用参数的机制。如果需要参数,则应使用外壳函数。请参阅外壳函数。我目前有一个别名,它接受第一个pos.参数,并将mi ethernet mac地址更改为它,它正在工作。@mklement0谢谢。我已经用你的改进更新了答案。天哪,你说得对。。我所有的$1调用都被忽略,参数被直接传递。。。我真是个天才,我正在修理它们。。非常感谢=“别名没有位置参数”是什么意思?我使用位置参数制作了别名,它们工作正常。@Ghost:From:csh中没有在替换文本中使用参数的机制。如果需要参数,则应使用外壳函数。请参阅外壳函数。我目前有一个别名,它接受第一个pos.参数,并将mi ethernet mac地址更改为它,它正在工作。@mklement0谢谢。我已经用你的改进更新了答案。天哪,你说得对。。我所有的$1调用都被忽略,参数被直接传递。。。我真是个天才,我正在修理它们。。非常感谢=德乔。。。与echo相同,而且,作为一个双引号字符串,它会立即接受某些shell扩展,这在这里是不需要的。使用echo“…”。此外,不要双引号引用$1实例,这意味着脚本将使用嵌入空格的参数中断。echo。。。与echo相同,而且,作为一个双引号字符串,它会立即接受某些shell扩展,这在这里是不需要的。使用echo“…”。此外,不要双引号引用$1实例,这意味着脚本将使用嵌入空格的参数中断。