[BASH] Getting a semi-tailing backslash when passing (escaped) variables to script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting [BASH] Getting a semi-tailing backslash when passing (escaped) variables to script
# 1  
Old 04-28-2015
[BASH] Getting a semi-tailing backslash when passing (escaped) variables to script

Heyas

Figured me had a 'typo' in tui-conf-set, i went to fix it.
Now, i also figured, it might be nice to have tui-conf-set report (to console, not only exit code) wether it could save the variable to the file or not.

This said, I appended this code: (the tui-title and tui-echo lines are just for debuging)
Code:
	# Return true if replaced string was found
	if $GREP $Q "$str_checker" "$CONFFILE"
	then	# Success, visual-report only if verbose is enabled
		tui-title DEBUG-start
		tui-echo "Some value for \"$USER\" to compare in ${PWD} on ${HOSTNAME/*.}"
		tui-echo "$VARNAME"
		tui-echo "$VALUE"
		tui-echo  "\"$str_checker\" as \"$VARNAME\"."
		tui-echo  "\"$VALUE\" as \"$VARNAME\"."
		tui-echo  "$VALUE as $VARNAME."
		tui-title DEBUG-stop
		$beVerbose && tui-status 0 "Saved \"$CONFFILE\""
		exit 0
	else	# It failed, visual-report only if verbose
		$beVerbose && tui-status 1 "Could not write to \"$CONFFILE\""
		exit 1
	fi

Which looks like:
Code:
+ bin $ $tcs -v $F/rpm.conf specfile "\\\$prj_path/\\\$prj_name.spec2"
++ echo 'specfile=$prj_path/$prj_name.spec2'
++ sed 's,\$,\\\$,g'
+ SEARCH='specfile=\$prj_path/\$prj_name.spec2'
+ true
+ cmd='sed s,"specfile=\$prj_path/\$prj_name.spec2","specfile="\$prj_path/\$prj_name.spec2"",g -i /home/sea/.config/dev-scripts/prjs/st/rpm.conf'
+ eval 'sed s,"specfile=\$prj_path/\$prj_name.spec2","specfile="\$prj_path/\$prj_name.spec2"",g -i /home/sea/.config/dev-scripts/prjs/st/rpm.conf'
++ sed 's,specfile=$prj_path/$prj_name.spec2,specfile=$prj_path/$prj_name.spec2,g' -i /home/sea/.config/dev-scripts/prjs/st/rpm.conf
++ echo '\$prj_path/\$prj_name.spec2'
++ sed 's,\\\$,$,g'
+ str_checker='$prj_path/$prj_name.spec2'
+ set +x
# |                                           DEBUG-start                                            | #
# | Some value for "sea" to compare in /home/sea/prjs/tui/bin on localdomain                         | #
# | specfile                                                                                         | #
# | \$prj_path/\$prj_name.spec2\                                                                      | #
# | "$prj_path/$prj_name.spec2" as "specfile".\                                                       | #
# | "\$prj_path/\$prj_name.spec2" as "specfile".\                                                     | #
# | \$prj_path/\$prj_name.spec2 as specfile.\                                                         | #
# |                                           DEBUG-stop                                             | #
# | Saved "/home/sea/.config/dev-scripts/prjs/st/rpm.conf"                                  [  √   ] | #

Which doesnt look 'that' bad, but if you place this output in a terminal window, its quite annoying, please see the attachment.

The script is working, as it actualy saves or changes the passed value of a variable into the file, regardless of plaintext, variables or escaped variables.
Just when i enable verbose mode, to display wether or not the file could be written, ti 'display' fails due to an additional char/symbol i have no idea from where it is comming.

My assumption was, since special chars are passed (\ and $), it also invokes the change from $ to \$ (marked that section bold), and for some reason it appens a \ to the EOL sign $, but since its the EOL-sign (within a variable), one only char seen is \.
This theory is destroyed, as that variable is at the end of the output string seen in above text example.

The code below is prior to the finalcheck code from above:
Code:
	CONFFILE="$1"
	VARNAME="$2"
	VALUE="$3"
	 
	# File does not exist yet
	if [ ! -f "$CONFFILE" ]
	then	tui-bol-dir "$(dirname $CONFFILE)" || exit 1
                touch "$CONFFILE"
	fi
#
# 	Preformat strings
#
	SEARCH="$( $GREP $OPT -v ^# "$CONFFILE"|$GREP "${VARNAME}=")" #|tr -d '[[:space:]]')"
	SEARCH="$(echo $SEARCH|$SED -e 's/^[[:space:]]*//')"
	
	# Apply options
	$SMALL && VARNAME="${VARNAME,,}" && VALUE="${VALUE,,}"
	$CAPS  && VARNAME="${VARNAME^^}" && VALUE="${VALUE^^}"
	
	# Check for quotes
	printf  "$VALUE"|$GREP $Q [\ \$] && \
		REPLACE="$VARNAME=\"$VALUE\"" || \
		REPLACE="$VARNAME=$VALUE"
	
	# Set proper SED 'divider'
	if echo "$VALUE"|$GREP $Q "$SD"
	then 	# Coma was found
		SD="/"
		printf "$REPLACE"|$GREP "$SD"|$GREP -q '\\' && SD="\\"	# backslash was found
		[ ! "$SD" = "/" ] && \
			printf "$REPLACE"|$GREP ","|$GREP "$SD"|$GREP -q "/" && SD="|"	# Forward slash was found
	fi
	
	# Troubles with VARIABLES due to chars that need to be escaped
        if echo "$REPLACE" | $GREP $Q '[%$+@\]'
	then	hadDollar=true
		str_checker="$(echo $VALUE|$SED s,'\\\$','$',g)"
	else	str_checker="$VALUE"
	fi
#
#	Display & Action
#
	# Save changes, Append or change var=value?
	if ! $GREP "${VARNAME}=" "$CONFFILE" | $GREP $Q -v ^"#"
	then	# Its not there yet, just append it
		if $hadDollar
		then	# It needs special treatement
			echo "$(echo $REPLACE)" >> "$CONFFILE"
		else	# Easy handling
			echo "${REPLACE}" >> "$CONFFILE"
			
		fi
	else	# Its already there, handling according to special chars
		set -x
		SEARCH="$(echo $SEARCH|$SED s,'\$','\\\$',g)"
		if $hadDollar
		then	# It needs special treatement
			cmd="$SED s${SD}\"${SEARCH}\"${SD}\"${REPLACE}\"${SD}g -i $CONFFILE"
			eval "$cmd"
		else	# It is simple to call
			cmd="$SED s${SD}${SEARCH}${SD}${REPLACE}${SD}g -i $CONFFILE"
			$cmd
		fi
		set +x
	fi

Please, any ideas what/why its causing that backslash?
Thank you in advance.

NOTE:
With 'regular' (non-escaped) variables it works (the output between the DEBUG-st*) just fine too.
[BASH] Getting a semi-tailing backslash when passing (escaped) variables to script-tui-conf-set_verbosejpg

Last edited by sea; 04-28-2015 at 03:28 AM..
# 2  
Old 04-28-2015
Not quite understanding your problem, and not knowing the contents of GREP but assuming it's grep, this $GREP $Q [\ \$] yields the error msg grep: [ $]: No such file or directory so it will always execute the FALSE branch of your conditional.
PLUS, you should supply a format string to printf, esp. if VALUE contains special chars.
This User Gave Thanks to RudiC For This Post:
# 3  
Old 04-28-2015
If the $Q is an option, it does work. But you still should quote '[ $]'. The shell will expand that if there is a matching file (ie, you've a file named $ then you no longer will be searching for ' ' and $, but only $).

As for the original problem, if i'm understanding it correctly, it seems to be a bug in tui-echo's ability to interpret backslashes.
This User Gave Thanks to neutronscott For This Post:
# 4  
Old 04-29-2015
Added single quotes, and removed the escape chars from that named if block.
And yes, that $Q was/is an option : -q, sry forgot to mention.

During the writing of tui-cat, i've added a code block to tui-printf (the very core display command) which escaped tailing backslashes, you know, to keep them when using tui-cat, and not get them changed to one-liners...
Seems that function also jumped in as soon the strings contained dollars/variables. Though, it seemed to only add a single backslash at the end of the string.
tui-printf:
Code:
	# Escape trailing backslash, from whichever argument passed
	# This is supposed to 'keep' artificial linebreaks rather than get them on one line
	echo "$FIRST" | grep -q "\\"$ && \
		FIRST="${FIRST}\\\\"
	echo "$SECOND" | grep -q "\\"$ && \
		SECOND="${SECOND}\\\\"
	echo "$THIRD" | grep -q "\\"$ && \
		THIRD="${THIRD}\\\\"
	
	# Escape '%'
	...

So it seems now, that i need something else to preserve articifical linebreaks, but not add unrequred baskslashes to strings with variables...
How to define that $ is supposed to be the line end only, but not a variable indicator at all?
Kind of helpless, as i though the above code whould do so...

Thank you

---------- Post updated at 13:41 ---------- Previous update was at 12:52 ----------

Guess i solved it, at least for this one time test it worked:
Changed it to:
Code:
        [ "\\" = "${FIRST:0:(-1)}" ] && \
                FIRST="${FIRST}\\"

Thank you
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

[Bash] passing variables to executable doesn't work

Bash version 4.4.20 / Ubuntu 16.0.4 Hello, I tried to write a script that gathers some data and passes them to an executable. The executed application answers with an error. The echo output in the script returns correct values. If I copy/paste the last echo command, it get's executed... (2 Replies)
Discussion started by: sushi2k7
2 Replies

2. Shell Programming and Scripting

Passing variables from one script to another

Hi, this is the example i'm trying to do. script1.sh ABC="test.txt" ./script2.sh "$ABC" script2.sh INPUT="$HOMEDIR/$ABC" echo $INPUT when i run the 1st script it gives me ../home/ the test.txt is not passed into 2nd script. How can i resolve this. (2 Replies)
Discussion started by: gskris88
2 Replies

3. Shell Programming and Scripting

Passing awk variables to bash variables

Trying to do so echo "111:222:333" |awk -F: '{system("export TESTO=" $2)}'But it doesn't work (2 Replies)
Discussion started by: urello
2 Replies

4. UNIX for Dummies Questions & Answers

Using read with escaped variables

Not sure if this is possible, but I'm trying to read in a variable that needs to have its escape backslashes intact. So the person who enters the actual value does not have to type any \ characters. Example: read list X1000\ filecab.txt echo "$list" In this case the \ needs to be... (3 Replies)
Discussion started by: newbie2010
3 Replies

5. Shell Programming and Scripting

Passing backslash character to awk variable

Hi All. I have a file that contains some special characters and I'm trying to use AWK to search for lines between <pattern1> and <pattern2>. As an example: I need the lines between the line containing ' select_id="x_0 ' and the line containing the next instance of ' from '. This is a file... (5 Replies)
Discussion started by: Mudshark
5 Replies

6. Shell Programming and Scripting

Passing variables from bash to php-cli

Hello everyone, I've been looking how to pass variables between bash and php-cli in 1 file. So far i got this: #!/bin/bash echo "This is bash" php << EOF <?php echo "This is php\n"; ?> EOF I would now like to be able to pass a variable declared in the bash to the php. I already... (0 Replies)
Discussion started by: robbee
0 Replies

7. Shell Programming and Scripting

passing double backslash(\\) as a path in unix

Hi All, I am trying to add a tag in the *.imp file. This is a piece of code which I am giving in my template file and my script reads this template file attachment and passes to windows server(as they have provided the below file path). ... (3 Replies)
Discussion started by: defendersubbu
3 Replies

8. Shell Programming and Scripting

Passing variables problem - Bash

I have a following problem: #!/bin/bash NUM=`cat accounts | wc -l`; for i in {1..$NUM} do account=`awk "NR==$i" accounts`; echo -e "\nAccount: $account\n"; sudo ./backup_maildir $account; done "accounts" is a file with regular e-mail addresses, one in each line.... (2 Replies)
Discussion started by: bobanpetrovic
2 Replies

9. Shell Programming and Scripting

bash - add backslash in front of variables w/ spaces

Hello, Im writing a script that works by recursively going into directories with find. But I have some directories that have spaces in them.. so I need to parse the variables to add a backslash before the spaces. Im not exactly sure how how to do this in bash, and honestly I dont think I know... (3 Replies)
Discussion started by: trey85stang
3 Replies

10. Shell Programming and Scripting

problems with sed and bash. Escaped characters ?

Hi, I'm writing a long script for bash (on RHEL 5.0) to execute many commands. So, my idea is to create a function to deal with error checking and logging (see ceckoutput() below). This works with all commands except for sed. I think it may be a problems with escaped characters. So I did the... (4 Replies)
Discussion started by: macL
4 Replies
Login or Register to Ask a Question