2016-07-28 133 views
2

我试图将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也是相同的,无论我输入哪个值。

+0

你在那个变量中得到了什么? –

+0

无论我通过什么变量 –

+0

,它每次都输出相同的md5哈希是否之前创建了具有md5sum的文件夹?即对于所有有效的输入参数,是否存在具有其散列值的目标文件夹? – Inian

回答

0

这可以作为一个解决方案,任何人有这个问题

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

这将不会导航到散列目录名称路径,因为该脚本在未反映出来的子shell上执行。请参阅我上面的答案! – Inian

+0

@Inian你所要做的就是“.md5 name” –

+0

我不确定那是什么意思! – Inian

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. 输入未加引号使用。

我会写一个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