无法从包含句点的参数中“触摸”文件

时间:2013-07-21 12:14:02

标签: linux bash

我正在尝试制作一个shell脚本,它为qemu-launcher制作了一个配置文件(我尝试过的4个唯一的qemu GUI,对我来说很有用)一步一步,但无法弄清楚如何通过“touch”命令的命令行参数。

我的控制台输入为config hello.iso

到目前为止我的脚本是:

#!/bin/sh

touch $1

哪个不会创建文件。我已经尝试制作一个等于$1的变量,然后使用它,但我仍然没有得到回应。我在双引号和单引号中都试过$1;使用double我什么也得不到,单个生成的文件名为1

但是,如果我传递了只有hello的参数,那么会创建具有该名称的文件,但我需要扩展名以用于其他内容。

不可能这样做吗?或者我只是不理解它?

我真正想做的是接受参数并从中移除.iso,然后将其用作文件名,但我很确定我可以使用grep正向前瞻来做。

2 个答案:

答案 0 :(得分:0)

如果你使用bash而不是sh:

#! /bin/bash

myVar=$1
touch ${myVar%.iso}

将完成这项工作。 '%'后面的字符串从变量内容的末尾被删除。 要获取有关当前脚本版本的更多信息,请尝试以下操作:

  • 重命名您的脚本 - 请勿使用'config'
  • 通过'echo'更改'touch'
  • 将脚本的输出重定向到文件
  • 使用

    查看输出内容

    od -a myOutputOfTheScript

或...... 用

调用你的脚本

bash -x myScript hello.iso> ouput.txt

答案 1 :(得分:0)

你所拥有的(带双引号的变体)是正确的。更改为/bin/bash无法解决此问题,因为bash和sh完全重叠此语法:

#!/bin/sh

touch "$1"

要检查/尝试的一些事情:

  1. 请确保您已使用chmod +x config
  2. 启用了执行权限
  3. 如果您在目录中,请确保将其作为./config hello.iso运行,或者使用其完整路径名,否则(仅限示例)/home/your-username/bin/config hello.iso,具体取决于您放置脚本的位置。
  4. 尝试在脚本中的set -x行上方添加touch "$1"以查看调试跟踪。
  5. 在少数shell实现(特别是csh)上,如果脚本末尾没有换行符,则会跳过脚本的最后一行。我通常只添加#---eof之类的评论。在大多数现代炮弹中,这不太可能成为问题。
  6. 您的路径中可能已有一个名为config的系统命令。运行type config进行检查。我建议为脚本选择一个更具体的名称来降低这种碰撞的几率。

    您有一个工作脚本(可能名称更好),通常将其放在主目录中名为bin的目录中,然后确保该目录的名称位于PATH环境中变量。检查env,向PATH添加缺少的目录因shell和品味而异,~/.bashrc是最常见的地方(虽然技术上有限),~/.bash_login~/.bash_profile或{对于新用户来说,{1}}通常更好但更棘手。在所有这些中,~/.profile指的是您的主目录。

    典型的路径:

    ~

    脚本编写者通常喜欢什么(假设这里有一个名为$ env | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ):

    scripter

    此用户将$ env | grep PATH PATH=/home/scripter/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 脚本放在config中 - 但选择了不同的名称; - )