Alternative approach. Ask the user to enter the filenames one by one.
This will work for filenames with or without space characters.
In this script, entering a blank filename means end-of-list and we "break" out of the "while true" loop.
Notice that we always have double quotes round a filename if it might contain space characters.
Thank you, Chubler_XL. It is a great progress that backslashes now work as I wanted. However, I still need more way to go. I would like the wildcard asterisks (*) to work. I also want quotes to work.
In other words, I would like my script to take file names (or pathnames) from the user like arguments to the "rm" command, except that my script does not take options. I would like my script to interpret backslashes, quotes, wildcard asterisks (*) and delimiting spaces in the same manner as arguments to the "rm" command.
I would like my script to take file names (or pathnames) from the user like arguments to the "rm" command, except that my script does not take options. I would like my script to interpret backslashes, quotes, wildcard asterisks (*) and delimiting spaces in the same manner as arguments to the "rm" command.
Quote:
Originally Posted by Chubler_XL
the use of the eval command
Thank you, Chubler_XL, for a further improvement. However, the code does not handle wildcard asterisks (*) very well, if the file intended to be matched contains a space.
Suppose that the current directory has the following four files. Also suppose that the name of the above code supplied by Chubler_XL is "readtest.sh" and located at the parent directory of the current one.
Summer View.txt
Winter View.txt
scene 1.sh
scene 2.sh
Because it is dangerous to experiment with "rm", let us use "ls" instead. I would like to allow the user to input file names in the same manner as arguments to the "ls" command, except that my script does not take options.
First, I gave the following line to "ls" and "readtest.sh".
"Summer View.txt" Winter\ View.txt scene*.sh
The results were a success with "ls" and a failure with "readtest.sh". The "readtest.sh" script interpreted "scene" and "1.sh" as two separate files.
Second, I gave the following line to "ls" and "readtest.sh".
"Summer View.txt" Winter\ View.txt "scene*.sh"
Both "ls" and "readtest.sh" failed. The "readtest.sh" script mistook as if "scene 1.sh scene 2.sh" were a single file with a long name.
If "ls" correctly understands scene*.sh without quotes for "scene 1.sh" and "scene 2.sh", then I would like the script to understand it in the same manner as "ls".
If "ls" does not understand "scene*.sh" with quotes, then it will not matter to me whether the script understands it or not.
If "ls" correctly understands scene*.sh without quotes for "scene 1.sh" and "scene 2.sh", then I would like the script to understand it in the same manner as "ls".
It's got nothing to do with ls. ls doesn't know what * means.
The shell script understands that, if you're doing globbing, you want literal unmangled filenames, so * gets you literal unmangled filenames. The shell also understands that "thing in spaces" means a literal string and doesn't split it.
If your actual string contains quotes, that's an entirely different thing than a quoted string, though. To get that string in shell you'd have to do "\"thing in quotes\"". The shell doesn't unwrap the second layer of quotes because it thinks you want them, and won't do that kind of double think unless you tell it to -- which is a good thing, because if it did process everything it found in a variable, someone could type `sudo rm -Rf /` into your input and wipe your system.
That sort of shenanigans is why I wouldn't reccomend using eval to force the shell to evaluate the quotes, either. It'd technically work but would be a frightening security hole.
xargs also processes quotes, though! I've spent more time fighting that feature than using it, forcing xargs to use raw filenames containing spaces or quotes, but it might actually be useful here...
So:
Last edited by Corona688; 01-13-2012 at 01:57 PM..
Reason: typos
As you can tell LessNux we are very concerned with the security implications of using eval against user entered data. There are a few limited situations where using eval could be OK but in general it's pretty unsafe.
If you really need to do wildcard filename expansion/matching on userdata perhaps something in perl eg:
This User Gave Thanks to Chubler_XL For This Post:
My BASH script was supposed to call a command that takes file names (or pathnames). Suppose that the name of the command is TweakFile, and that its syntax is
TweakFile FILE...
After the perl function glob() parsed and expanded file names, how can I pass it to TweakFile on BASH?
Many thanks, in advance.
---------- Post updated at 10:27 AM ---------- Previous update was at 10:19 AM ----------
Quote:
Originally Posted by Corona688
xargs also processes quotes
Does xargs parse and expand file names without execution?
Hello.
System : opensuse leap 42.3
I have a bash script that build a text file.
I would like the last command doing :
print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt
where :
print_cmd ::= some printing... (1 Reply)
How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address
and column 3 contains “cc” e-mail address to include with same email.
Sample input file, email.txt
Below is an sample code where... (2 Replies)
I am trying to find lines in a text file larger than 3 Gb that start with a given string. My command looks like this:
$ look "string" "/home/patrick/filename.txt"
However, this gives me the following message:
"look: /home/patrick/filename.txt: File too large"
So, I have two... (14 Replies)
Hi,
I have line in input file as below:
3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL
My expected output for line in the file must be :
"1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL"
Can someone... (7 Replies)
Hi everyone,
I`ll try to be most clear I can explaining my help request.
I have 2 folders
Folder A-->This folder receives files through FTP constantly
Folder B-->The files from Folder A are unzipped and then processed in Folder B
Sometimes Folder A doesn`t contain all... (2 Replies)
I have to read a file line by line, change it and then update the file. Problem is, when i read the file, "read" command ignores leading spaces.
The file is a script which is indented in many places for clarity. How to i make "read" command read leading spaces as well. (3 Replies)
Hallo,
i need a Prompting read in my script:
read -p "Enter your command: " command
But i always get this Error:
-p: is not an identifier
When I run these in c-shell i get this error
/usr/bin/read: read: bad option(s)
How can I use a Prompt in the read command? (9 Replies)
Hi,
I need a command in UNIX KSH below is the description...
MAPPING DESCRIPTION ="Test Mapping for the calid inputs" ISVALID ="YES" NAME ="m_test_xml" OBJECTVERSION ="1" VERSIONNUMBER ="1"
unix ksh command to read the DESCRIPTION and write to a file
Test Mapping for the calid inputs... (3 Replies)
Dear friends, following is the output of a script from which I want to remove spaces and new-line characters.
Example:-
Line1 abcdefghijklmnopqrstuvwxyz
Line2 mnopqrstuvwxyzabcdefghijkl
Line3 opqrstuvwxyzabcdefdefg
Here in above example, at every starting line there is a “tab” &... (4 Replies)
Hi,
I am new to shell script. This is my first post .I have written a small script which returns list of names starts with "ram" in /etc/passwd .Here is that:-
#!/bin/ksh
NAME_LIST="name_list.txt"
cat /dev/null > $NAME_LIST
evalcmd="cat /etc/passwd | grep "^ram?*" | cut -d: -f1"
eval... (3 Replies)