将bash参数作为字符串传递

时间:2015-04-09 23:43:21

标签: bash

我有一点点,可能是非常愚蠢的问题..

我正在尝试为tar和gzip创建一个使用文件名(作为参数给出)的别名,但它没有按预期转换为输出中的文件名。

我的别名是:

alias targz='tar -cvzf $1.tar.gz $1'

它可以正常工作,但是在设置文件名时,存储在$ 1中的参数无法正常工作,它会将其拉成一个名为“.tar.gz”的文件。

我尝试回复'$ 1.tar.gz',输出为'.tar.gz',所以,我认为它应该是非常愚蠢的格式。

欢迎任何帮助,

3 个答案:

答案 0 :(得分:4)

别名没有位置参数。它们基本上是宏(别名在执行时会被别名的文本替换)。

你可以使用一个功能:

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更简洁,更有效地剥离结尾斜杠。

答案 1 :(得分:1)

为函数使用别名,例如:

 alias targz='function targz_() { tar -cvzf "$1.tar.gz" "$1"; return 0; }; targz_ '

答案 2 :(得分:0)

尝试创建一个脚本来执行此操作,就像这样。

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