设置shell脚本变量以输出命令

时间:2016-07-28 16:17:28

标签: linux bash shell

我试图cd进入脚本中设置的任何变量的md5哈希,但是我没有得到正确的md5值,我认为它与我如何声明我的变量有关。谢谢你的帮助!

#!/bin/bash
var1=$1
md5=$(-n $var1 | md5sum)
cd /var/www/html/$md5

我希望它能带我到md5哈希给出的目录:

$ ./myscript hello
(no output)
$ pwd
/var/www/html/5d41402abc4b2a76b9719d911017c592

相反,它会给我错误并尝试cd到错误的路径:

$ ./myscript hello
./myscript: line 3: -n: command not found
./myscript: line 4: cd: /var/www/html/d41d8cd98f00b204e9800998ecf8427e: No such file or directory
$ pwd
/home/me

无论我输入哪个值,它错误地尝试cd到的md5sum也是一样的。

2 个答案:

答案 0 :(得分:0)

这可以解决其他任何有此问题的人

#!/bin/bash
md5=$*
hash="$(echo -n "$md5" | md5sum )"
cd /var/www/html/$hash

答案 1 :(得分:0)

你的剧本:

#!/bin/bash
var1=$1
md5=$(-n $var1 | md5sum)
cd /var/www/html/$md5

这有几个问题:

  1. -n不是管道-n $var1 | md5sum中的有效命令。
  2. md5sum返回的不仅仅是MD5摘要。
  3. 更改脚本中的目录不会反映在调用shell中。
  4. 输入未加引用。
  5. 我会为此编写一个shell函数,而不是脚本:

    function md5cd {
      dir="$( printf "%s" "$1" | md5sum - | cut -d ' ' -f 1 )"
      cd /var/www/html/"$dir" || return 1
    }
    

    该函数使用md5sum计算给定字符串的MD5摘要,并切断输出的部分文件名(-)。然后它将目录更改为指定的位置。如果目标目录不存在,则通过返回非零退出状态来发出此信号。

    将它扩展到cd到从命令行上的路径构造的路径,但最后一个路径元素更改为MD5摘要(只是为了好玩):

    function md5cd {
      word="${1##*/}"
    
      if [[ "$word" == "$1" ]]; then
        prefix="."
      else
        prefix="${1%/*}"
      fi
    
      dir="$( cut -d ' ' -f 1 <( printf "%s" "$word" | md5sum - ) )"
      cd "$prefix"/"$dir" || return 1
    }
    

    测试它:

    $ pwd
    /home/myself
    
    $ echo -n "hex this" | md5sum
    990c0fc93296f9eed6651729c1c726d4  -
    
    $ mkdir /tmp/990c0fc93296f9eed6651729c1c726d4
    
    $ md5cd /tmp/"hex this"
    
    $ pwd
    /tmp/990c0fc93296f9eed6651729c1c726d4