如何处理变量?

如何处理变量?

我想处理一组文件。

pi@raspberrypi:~/A6.1 $ ls -1

0bd57df4.code
0bd57df4.enc
3189204c.code
3189204c.enc
39f831fb.code
39f831fb.enc
68ff6d19.code
68ff6d19.enc
find.sh
test.sh

我运行一个脚本 ( find.sh),通过掩码搜索文件,然后运行另一个脚本 ( test.sh) 并将找到的文件的名称传递给参数。

在测试模式下,我想显示完整的文件名和不带扩展名的缩写名称。

find.sh 文件的内容:

#!/bin/bash

find -name '*.enc' -printf "%f\0" | xargs -0 -n 1 ./test.sh

文件test.sh的内容:

# !/bin/bash

NAMEFILE=$1
FULLNAME=$NAMEFILE
CUTNAME=`echo ${NAMEFILE:0:6}`
echo "FULLNAME - "$FULLNAME
echo "FILENAME - $CUTNAME"

显示全名,没有缩写名。给出错误信息。如何处理变量?

pi@raspberrypi:~/A6.1 $ ./find.sh
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 68ff6d19.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 3189204c.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 39f831fb.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 0bd57df4.enc
FILENAME -

当我运行 test.sh 文件时,它起作用了。

pi@raspberrypi:~/A6.1 $ ./test.sh 68ff6d19.code
FULLNAME - 68ff6d19.code
CUTNAME - 68ff6d19

答案1

我有一种感觉,您也许可以通过使用 GNU Parallel 来集中您的代码:

find -name '*.enc' | parallel echo Full:{} Cut:{.}

或者如果代码更复杂:

#!/bin/bash

doit() {
  FULLNAME="$1"
  CUTNAME="$2"
  echo "FULLNAME - $FULLNAME"
  echo "FILENAME - $CUTNAME"
}
export -f doit

find -name '*.enc' | parallel doit {} {.}

答案2

该错误来自运行/bin/sh不具有您使用的特定参数扩展的脚本。您之所以使用,是因为第一行的和/bin/sh之间有一个空格。#!

允许有空格!#!之间是否允许有空格和 Shebang 中的 /bin/bash ?

还相关:哪个 shell 解释器运行不带 shebang 的脚本?


您可以在这里轻松地使用单个脚本:

find . -type f -name '*.enc' -exec bash -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n:0:6}"
    done' sh {} +

对您提供的文件名运行此命令将产生

Full name:      0bd57df4.enc
Cut name:       0bd57d
Full name:      3189204c.enc
Cut name:       318920
Full name:      39f831fb.enc
Cut name:       39f831
Full name:      68ff6d19.enc
Cut name:       68ff6d

如果您只想删除扩展程序:

find . -type f -name '*.enc' -exec sh -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n%.*}"
    done' sh {} +

这产生

Full name:      0bd57df4.enc
Cut name:       0bd57df4
Full name:      3189204c.enc
Cut name:       3189204c
Full name:      39f831fb.enc
Cut name:       39f831fb
Full name:      68ff6d19.enc
Cut name:       68ff6d19

相关内容