expression - bash variable evaluating with quote for special character -
below simple bash script test few password in rar file. when password contains special character (!), see option (-p) parsed quote (').
#!/bin/bash -x pwd=`echo sei{0..9}{0..9}b{0..9}axq!zx` #pwd=sei03b4axq!zx file="test.rar" eachpwd in $pwd eval unrar x "$file" -p"$eachpwd" id 2>/dev/null 1>/dev/null c=$? if [ $c = 0 ] echo "success" exit fi echo $eachpwd $c done output
+ eachpwd in '$pwd' + eval unrar x test.rar '-psei49b4axq!zx' id + c=10 + '[' 10 = 0 ']' + echo 'sei49b4axq!zx' 10 question
how code such that, during eval not unrar x test.rar '-psei49b4axq!zx' id instead unrar x test.rar -psei49b4axq!zx id evaluated expression
update 1
tried below code, still quote(!) on -p option refuses budge.
passwords=( sei{0..9}{0..9}b{0..9}axq!zx ) file=test.rar password in "${passwords[@]}"; if unrar x "$file" -p"$password" id 2>/dev/null 1>/dev/null; echo "success" exit else echo $password failed. fi done result
+ password in '"${passwords[@]}"' + unrar x test.rar '-psei21b0axq!zx' id + echo 'sei21b0axq!zx' failed. sei21b0axq!zx failed. + password in '"${passwords[@]}"' + unrar x test.rar '-psei21b1axq!zx' id please note using bash shell execution.
there couple of possible explanations happening, none of worth exploring because don't need use eval. also, it's better use array hold passwords, or put brace expression directly in for loop, rather creating single string.
# use single quotes on small chance history expansion # enabled, protect !. can drop them. passwords=( sei{0..9}{0..9}b{0..9}'axq!zx' ) password in "${passwords[@]}"; if unrar x "$file" -p "$eachpwd" id 2>/dev/null 1>/dev/null; echo "success" exit fi done
Comments
Post a Comment