根据 Bash 中尚不存在的另一个变量分配变量值

根据 Bash 中尚不存在的另一个变量分配变量值

对于 BASH 脚本,我需要将另一个尚不存在的变量的值赋给脚本中较早的变量。但是,在为较晚的变量赋值之前,我不需要调用较早的变量。

基本上,我需要第 32 行中的变量a(以及其他实例)接受分配给另一个变量的值,t该变量直到第 132 行才存在(并且其值将随循环而变化)。a直到赋值后才调用该变量t。我想我可以在第 135 行之后使用第二组 CASE 语句找到替代解决方案,但如果我想要完成的事情是可能的,那么它将节省我的时间,并且它将是一种新技术,我可以将其添加到我的未来脚本的工具带中。

那么,我想做的事情是否可行?如果可行,我该如何实现?提前致谢。

1   IFS=$'\n'                               
2                                   
3   for i in {Gamma,Saturation,Brightness,Contrast}; do                             
4       for j in {Gamma,Saturation,Brightness,Contrast}; do                         
5           for k in {Gamma,Saturation,Brightness,Contrast}; do                     
6               for m in {Gamma,Saturation,Brightness,Contrast}; do                 
7                                   
8                   if [[ $i == $j || $i == $k || $i == $m || $j == $k || $j == $m || $k == $m ]]; then             
9                       continue            
10                  fi              
11                                  
12                  count=1             
13                                  
14                  s1=""               
15                  e1=""               
16                  i1=""               
17                  s2=""               
18                  e2=""               
19                  i2=""               
20                  s3=""               
21                  e3=""               
22                  i3=""               
23                  s4=""               
24                  e4=""               
25                  i4=""               
26                                  
27                  case $i in              
28                      Gamma)          
29                          s1=0.80     
30                          e1=1.20     
31                          i1=0.20     
32                          a=$t        
33                          ;;      
34                      Saturation)         
35                          s1=-20      
36                          e1=20       
37                          i1=20       
38                          b=$t        
39                          ;;      
40                      Brightness)         
41                          s1=-15      
42                          e1=15       
43                          i1=5        
44                          c=$t        
45                          ;;      
46                      Contrast)           
47                          s1=-30      
48                          e1=60       
49                          i1=10       
50                          d=$t        
51                          ;;      
52                  esac                
53                  case $j in              
54                      Gamma)          
55                          s2=0.80     
56                          e2=1.20     
57                          i2=0.20     
58                          a=$x        
59                          ;;      
60                      Saturation)         
61                          s2=-20      
62                          e2=20       
63                          i2=20       
64                          b=$x        
65                          ;;      
66                      Brightness)         
67                          s2=-15      
68                          e2=15       
69                          i2=5        
70                          c=$x        
71                          ;;      
72                      Contrast)           
73                          s2=-30      
74                          e2=60       
75                          i2=10       
76                          d=$x        
77                          ;;      
78                  esac                
79                  case $k in              
80                      Gamma)          
81                          s3=0.80     
82                          e3=1.20     
83                          i3=0.20     
84                          a=$y        
85                          ;;      
86                      Saturation)         
87                          s3=-20      
88                          e3=20       
89                          i3=20       
90                          b=$y        
91                          ;;      
92                      Brightness)         
93                          s3=-15      
94                          e3=15       
95                          i3=5        
96                          c=$y        
97                          ;;      
98                      Contrast)           
99                          s3=-30      
100                         e3=60       
101                         i3=10       
102                         d=$y        
103                         ;;      
104                 esac                
105                 case $m in              
106                     Gamma)          
107                         s4=0.80     
108                         e4=1.20     
109                         i4=0.20     
110                         a=$z        
111                         ;;      
112                     Saturation)         
113                         s4=-20      
114                         e4=20       
115                         i4=20       
116                         b=$z        
117                         ;;      
118                     Brightness)         
119                         s4=-15      
120                         e4=15       
121                         i4=5        
122                         c=$z        
123                         ;;      
124                     Contrast)           
125                         s4=-30      
126                         e4=60       
127                         i4=10       
128                         d=$z        
129                         ;;      
130                 esac                
131                                 
132                 for t in `seq $s1 $i1 $e1`; do              
133                     for x in `seq $s2 $i2 $e2`; do          
134                         for y in `seq $s3 $i3 $e3`; do      
135                             for z in `seq $s4 $i4 $e4`; do  
136                                 
137                                 if [[ $s1 == "0.80" ]]; then k=`printf "%0.2f\n" $t`; t=$k; fi
138                                 if [[ $s2 == "0.80" ]]; then k=`printf "%0.2f\n" $t`; x=$k; fi
139                                 if [[ $s3 == "0.80" ]]; then k=`printf "%0.2f\n" $t`; y=$k; fi
140                                 if [[ $s4 == "0.80" ]]; then k=`printf "%0.2f\n" $t`; z=$k; fi
141                                 
142                                 echo $a $b $c $d $t $x $y $z
143                                 echo "Color_""$a""_""$b""_""$c""_""$d"".tif"
144                                 echo "Color_Glossy_""$i""_""$j""_""$k""$m""/"
145                                 echo ${i:0:1}" "$t" "${j:0:1}" "$x" "${k:0:1}" "$y" "${m:0:1}" "$z".tif"
146                                 echo ""
147                                 sleep 0.1
148                             done    
149                         done        
150                     done            
151                 done                
152             done                    
153         done                        
154     done                            
155 done                                

虽然我仍然很想知道我最初的问题是否可以按照我描述的方式解决,但这是我的解决方案,以防任何偶然发现这个问题的人也想看到解决方案 - 即使不是我寻求的方式。

IFS=$'\n'

for i in {Gamma,Saturation,Brightness,Contrast}; do
    for j in {Gamma,Saturation,Brightness,Contrast}; do
        for k in {Gamma,Saturation,Brightness,Contrast}; do
            for m in {Gamma,Saturation,Brightness,Contrast}; do

                if [[ $i == $j || $i == $k || $i == $m || $j == $k || $j == $m || $k == $m ]]; then
                    continue
                fi

                mkdir "Color_Glossy_""$i""_""$j""_""$k""_""$m"

                count=0001

                case $i in 
                    Gamma)
                        s1=0.80
                        e1=1.20
                        i1=0.20
                        ;;
                    Saturation)
                        s1=-20
                        e1=20
                        i1=20
                        ;;
                    Brightness)
                        s1=-15
                        e1=15
                        i1=5s
                        ;;
                    Contrast)
                        s1=-30
                        e1=60
                        i1=10
                        ;;
                esac
                case $j in 
                    Gamma)
                        s2=0.80
                        e2=1.20
                        i2=0.20
                        ;;
                    Saturation)
                        s2=-20
                        e2=20
                        i2=20
                        ;;
                    Brightness)
                        s2=-15
                        e2=15
                        i2=5
                        ;;
                    Contrast)
                        s2=-30
                        e2=60
                        i2=10
                        ;;
                esac
                case $k in 
                    Gamma)
                        s3=0.80
                        e3=1.20
                        i3=0.20
                        ;;
                    Saturation)
                        s3=-20
                        e3=20
                        i3=20
                        ;;
                    Brightness)
                        s3=-15
                        e3=15
                        i3=5
                        ;;
                    Contrast)
                        s3=-30
                        e3=60
                        i3=10
                        ;;
                esac
                case $m in 
                    Gamma)
                        s4=0.80
                        e4=1.20
                        i4=0.20
                        ;;
                    Saturation)
                        s4=-20
                        e4=20
                        i4=20
                        ;;
                    Brightness)
                        s4=-15
                        e4=15
                        i4=5
                        ;;
                    Contrast)
                        s4=-30
                        e4=60
                        i4=10
                        ;;
                esac

                for t in `seq $s1 $i1 $e1`; do
                    for x in `seq $s2 $i2 $e2`; do
                        for y in `seq $s3 $i3 $e3`; do
                            for z in `seq $s4 $i4 $e4`; do

                                if [[ $s1 == "0.80" ]]; then q=`printf "%0.2f\n" $t`; t=$q; fi
                                if [[ $s2 == "0.80" ]]; then q=`printf "%0.2f\n" $x`; x=$q; fi
                                if [[ $s3 == "0.80" ]]; then q=`printf "%0.2f\n" $y`; y=$q; fi
                                if [[ $s4 == "0.80" ]]; then q=`printf "%0.2f\n" $z`; z=$q; fi

                                case $i in 
                                    Gamma)
                                        a=$t
                                        ;;
                                    Saturation)
                                        b=$t
                                        ;;
                                    Brightness)
                                        c=$t
                                        ;;
                                    Contrast)
                                        d=$t
                                        ;;
                                esac
                                case $j in 
                                    Gamma)
                                        a=$x
                                        ;;
                                    Saturation)
                                        b=$x
                                        ;;
                                    Brightness)
                                        c=$x
                                        ;;
                                    Contrast)
                                        d=$x
                                        ;;
                                esac
                                case $k in 
                                    Gamma)
                                        a=$y
                                        ;;
                                    Saturation)
                                        b=$y
                                        ;;
                                    Brightness)
                                        c=$y
                                        ;;
                                    Contrast)
                                        d=$y
                                        ;;
                                esac
                                case $m in 
                                    Gamma)
                                        a=$z
                                        ;;
                                    Saturation)
                                        b=$z
                                        ;;
                                    Brightness)
                                        c=$z
                                        ;;
                                    Contrast)
                                        d=$z
                                        ;;
                                esac

                                old="Color_""$a""_""$b""_""$c""_""$d"".tif"
                                new="Color_Glossy_""$i""_""$j""_""$k""_""$m""/"$count" "${i:0:1}" "$t" "${j:0:1}" "$x" "${k:0:1}" "$y" "${m:0:1}" "$z".tif"

                                cp $old $new

                                count=$((10#$count+1))
                                countTmp=`printf "%04d\n" $count`
                                count=$countTmp
                            done
                        done
                    done
                done
            done
        done
    done
done

答案1

Bash 参考手册

参数扩展的基本形式是${parameter}。[…]

如果参数的第一个字符是感叹号 ( !),并且parameter不是 nameref,则会引入间接层。Bash 使用扩展参数其余部分形成的值作为新参数;然后对其进行扩展,并将该值用于其余扩展,而不是原始参数的扩展。这称为间接扩展。该值受波浪号扩展、参数扩展、命令替换和算术扩展的影响。[…] 感叹号必须紧跟在左括号后面才能引入间接。

因此,

a=$t

你分配

a=t

然后像这样检索值:

${!a}

例子:

$ a=t
$ echo "$a"
t
$ echo "$t"

$ echo "${!a}"

$ t=5
$ echo "${!a}"
5
$ t=foo
$ echo "${!a}"
foo
$

另一个例子:

$ x=1
$ y=2
$ z=3
$ a=x
$ echo "${!a}"
1
$ a=y
$ echo "${!a}"
2
$ a=z
$ echo "${!a}"
3
$ 

更多的

-n可以使用选项declare或内置命令 […]为变量分配 nameref 属性,local以创建 nameref 或对另一个变量的引用。这允许间接操作变量。每当引用、分配、取消设置 nameref 变量或修改其属性时(而不是使用或更改 nameref 属性本身),操作实际上是在 nameref 变量的值指定的变量上执行的。

这样你就不需要!,甚至可以间接地分配值。例如:

$ a=t
$ echo "$a"
t
$ declare -n a
$ echo "$a"

$ t=5
$ echo "$a"
5
$ t=foo
$ echo "$a"
foo
$ a=bar
$ echo "$t"
bar
$ declare +n a
$ echo "$a"
t
$

相关内容