有没有办法在最后_
分割这一行来创建两个变量?
Linux中的文件夹格式为Project_Data1_xxx
或Project_Data1_Sub1_xxx
。我想创建两个变量:
_
之后发生的事情。我花了很多时间在这上面并道歉,因为我是Linux新手,我还没有理解windows和linux之间的所有差异。
问题:我是否将其分为两个语句来获取正面和背面?
我正在将ls -1
文件夹转换为变量。所以我做了
#!/bin/bash
srcIn=/scripts/server1
dstIn=/scripts/server2
data=test
sourcein=$(ls $srcIn/ | grep $data)
destinationin=$(ls $dstIn/ | grep $data)
然后我得到:
echo $destinationin
test_data1_xxx test_data2_xxx test_data3_xxx
echo $sourcein
test_data1_ccc test_data2_ccc test_data3_ccc
最后。我需要创建一个复制行:
cp /test_data1_ccc/* /test_data1_xxx
cp /test_data2_ccc/* /test_data2_xxx
等等......可能有2或3个下划线,但格式始终相同。
字符串xxx
和ccc
可以是abc123
或ccc567
,并且不一定具有相同数量的字符。唯一不改变的是两个位置的唯一差异是在最后_
之后 - 但它们总是不同的。
答案 0 :(得分:3)
我会分两步完成。假设字符串在变量中:
name=Project_Data1_xxx
$ echo ${name%_*}
Project_Data1
$ echo ${name##*_}
xxx
${var%foo}
从最后删除foo
最短的内容${var##foo}
从头开始删除foo
发生的最长时间这些parameter expansions可以与通配符*
结合使用,以删除任何内容,而不是字符串文字。
在你的脚本环境中,我会建议这样的事情:
for input_dir in /scripts/server1/*data*/; do
base=${input_dir%_*} # trim the last part
base=${base##*/} # trim the leading part
dest=( /scripts/server2/"$base"*/ ) # find the destination dir
if [[ ${#dest[@]} -eq 1 ]]; then
cp "$input_dir"* "${dest[0]}"
else
echo "${#dest[@]} destination paths found, expected 1"
fi
done